当前位置: 首页 > 知识库问答 >
问题:

Spring Security:自定义用户详细信息

微生嘉祥
2023-03-14

我对Java和Spring3(过去8年主要使用PHP)还很陌生。我已经使用spring security 3来处理所有默认的userDetails和userDetailsService,我知道我可以通过使用以下命令访问控制器中登录用户的用户名:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName(); //get logged in username

但有两个问题我想不通:

>

  • 我希望在用户登录时存储许多其他用户详细信息(如DOB、性别等),并在以后通过控制器进行访问。我需要做什么才能使创建的userDetails对象包含我的自定义域?

    <global-method-security secured-annotations="enabled"></global-method-security>     
    <http auto-config='true' access-denied-page="/access-denied.html">
        <!-- NO RESTRICTIONS -->        
        <intercept-url pattern="/login.html" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <intercept-url pattern="/*.html" access="IS_AUTHENTICATED_ANONYMOUSLY"  /> 
        <!-- RESTRICTED PAGES -->
        <intercept-url pattern="/admin/*.html" access="ROLE_ADMIN" />
        <intercept-url pattern="/member/*.html" access="ROLE_ADMIN, ROLE_STAFF" />
    
        <form-login login-page="/login.html"
                    login-processing-url="/loginProcess"
                    authentication-failure-url="/login.html?login_error=1"
                    default-target-url="/member/home.html" />
        <logout logout-success-url="/login.html"/>
    </http>
    
    <authentication-manager>
        <authentication-provider>
            <jdbc-user-service data-source-ref="dataSource" authorities-by-username-query="SELECT U.username, UR.authority, U.userid FROM users U, userroles UR WHERE U.username=? AND U.roleid=UR.roleid LIMIT 1" />
            <password-encoder hash="md5"/>
        </authentication-provider>
    </authentication-manager>
    

    login.jsp:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
    
    <tiles:insertDefinition name="header" />
    <tiles:insertDefinition name="menu" />
    <tiles:insertDefinition name="prebody" />
    
    <h1>Login</h1>
    
    <c:if test="${not empty param.login_error}">
        <font color="red"><c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}"/>.<br /><br /></font>
    </c:if>
    <form name="f" action="<c:url value='/loginProcess'/>" method="POST">
        <table>
            <tr><td>User:</td><td><input type='text' name='j_username' value='<c:if test="${not empty param.login_error}"><c:out value="${SPRING_SECURITY_LAST_USERNAME}"/></c:if>' /></td></tr>
                <tr><td>Password:</td><td><input type='password' name='j_password' /></td></tr>
                <tr><td>&nbsp;</td><td><input type="checkbox" name="_spring_security_remember_me" /> Remember Me</td></tr>
                <tr><td>&nbsp;</td><td><input name="submit" type="submit" value="Login" /></td></tr>
            </table>
        </form>
    
    <tiles:insertDefinition name="postbody" />
    <tiles:insertDefinition name="footer" />
    
  • 共有1个答案

    步博涉
    2023-03-14

    这个问题有很多问题。我会试着解决它的碎片...

    问题1:这里有几种可能的方法。

    方法1:如果您有其他属性要添加到UserDetails对象中,那么您应该提供自己的UserDetails接口的替代实现,其中包括这些属性以及相应的getter和setter。这将要求您还提供自己的UserDetailsService接口的替代实现。该组件必须了解如何将这些附加属性持久化到基础数据存储,或者在从该数据存储读取数据时,必须了解如何填充这些附加属性。你会像这样把所有这些都连接起来:

    <beans:bean id="userDetailsService" class="com.example.MyCustomeUserDetailsService">
    <!-- ... -->
    </beans:bean>
    
    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="authenticationProvider"/>
    </authentication-manager>
    
    <beans:bean id="authenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDetailsService"/>
    </beans:bean>
    
    User user = userDao.getByUsername(SecurityContextHolder.getContext().getAuthentication().getName());
    
     类似资料:
    • 问题内容: 我正在尝试使用数据库表在Spring应用程序中应用安全性。 到目前为止,我的applicationContext-Security中有: 我对userDetailsS​​ervice的实现如下所示: 我的汇编程序如下所示: 现在,用户实体为: 我的userentitydao界面是: 实现是: 现在,当我尝试在tomcat上进行部署时,出现以下异常: 而不管我该怎么办,我不知道这是怎么回

    • 我正在使用spring security 3.2、JSF2和Hibernate4。 我已经完成了3/4的工作:)但是我的身份验证系统还不起作用。 我有一个实现UserDetailsService的UserService,一个实现UserDetails的域类用户。 登录系统从不阻止用户访问安全页面,我尝试了数据库中不存在的用户名和密码... 谢谢你的帮助。 我有一个loginBean,当用户通过登录

    • 我有一个富网络(基于反应)前端应用程序,它将请求发送到后端资源服务器应用程序。请求在头中与JWT一起发送以进行身份验证。我的设置对Okta授权服务器进行身份验证,并从单独的服务中检索组/授权。 我将后端服务器设置为Springboot应用程序,带有Spring Security Oauth2资源服务器 有了这个设置,我可以使用JwkTokenStore实现来验证JWT令牌(它在内部使用JwkVer

    • 同时尝试Spring启动、安全性和数据。 我刚刚遇到了这种情况: 我在内存数据库中使用H2,并在启动时用liquibase和一个用户用用户名和密码对其进行加密。 现在我想让Spring Security性根据H2进行身份验证。为此,我有以下代码: 并且我实现了如下userDetails: 但我的测试一直失败 身份验证不应为空 尝试登录会给我 凭据错误 要使UserDetailsService的自定

    • 我有一个Keycloak连接器,它允许我通过SSO检索用户的用户名。我想使用这个用户名来认证用户,并在数据库中查找他的权限,并将这个用户权限注入到spring security中,以便能够使用它的功能。 我用自定义的UserDetailsService创建了一个自定义的authenticationProvider,但我一直面临的问题是,我每次都被重定向到spring security登录页面。我认

    • 本文向大家介绍微信小程序  自定义创建详细介绍,包括了微信小程序  自定义创建详细介绍的使用技巧和注意事项,需要的朋友参考一下 微信小程序 自定义创建,最近自己捣鼓微信小程序的东西,这里对自定义创建做一个简单的资料整理,也许可以帮助大家。  微信小程序  自定义创建 自定义创建与默认创建完全相同, 只是不要勾选quick start即可 淡定(不要看到报错就紧张, 一定要淡定) 看看它说了什么,