【问题标题】:Adding new users in Spring Security在 Spring Security 中添加新用户
【发布时间】:2011-01-14 13:21:00
【问题描述】:

我在我的 Spring/Java EE Web 应用程序中设置了基本的 Spring 安全性。我可以限制对某些页面的访问并强制登录(使用角色等)。需要有一个表单,新用户可以在其中注册并指定登录名和密码。

我想知道,要创建新用户,我是否像任何查询一样简单地查询和更新适当的 Spring 安全表(例如使用休眠),或者是否有内置功能来创建新用户?如果我只是使用标准的 DAO 来更新用户,我应该如何处理密码的散列?

谢谢!

【问题讨论】:

    标签: java spring jakarta-ee spring-security


    【解决方案1】:

    您必须结合此页面上的所有答案。

    • Teja 是正确的,没有方便的方式来即时添加用户。
    • Axtavt 也是正确的。您需要某种数据访问/服务层来更新您的用户表。换句话说,您需要像任何其他具有某种超级用户访问权限的页面一样创建视图。
    • Michal 和 ax 给出了很好的建议,您可能需要在保存密码之前对其进行编码。摘要应与您检索凭据时使用的任何内容相匹配。

    这是一个使用 JDBC 的示例配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/security"
        xmlns:beans="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                            http://www.springframework.org/schema/security
                             http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
    
        <global-method-security secured-annotations="enabled"/>
    
        <http auto-config="true" access-denied-page="/accessDenied.jsp">
            <!-- login page has anonymous access -->
            <intercept-url pattern="/login.jsp*" filters="none"/>
            <!-- all pages are authenticated -->
            <intercept-url pattern="/**.action" access="ROLE_USER, ROLE_ADMIN"  />  
            <!-- all admin contextual pages are authenticated by admin role -->
            <intercept-url pattern="/admin/**" access="ROLE_ADMIN"  />
            <form-login authentication-failure-url="/login.jsp?login_error=1" default-target-url="/index.action" login-page="/login.jsp"/>
            <logout logout-success-url="/index.action"/>
        </http>     
    
        <authentication-provider>
            <password-encoder hash="md5" /> 
            <jdbc-user-service data-source-ref="dataSource" 
                authorities-by-username-query="SELECT username, role AS authority FROM sweet_users WHERE username = ?"
                users-by-username-query="SELECT username, password, 1 AS enabled FROM sweet_users WHERE username = ?" />
        </authentication-provider>
    </beans:beans>
    

    这是使用自定义查询来获取用户。 Spring Security 需要一个用户表,其中分别包含用户名、密码和权限列名称,因此请执行您需要执行的操作来返回这些名称。您需要提供数据源。

    如果您在 admin/ 上下文下创建了一个用于添加用户的页面,它将根据此配置进行身份验证。

    为您的 UserDao 和/或 UserService 和/或 AuthenticationService 添加一个 bean 并将其传递给您的用户控制器...

    【讨论】:

      【解决方案2】:

      Spring Security 有JdbcUserDetailsManager。它是默认的基于 JDBC 的 UserDetailsService 的子类,具有用于创建用户等的附加方法。您可以将其用作 DAO 而不是您自己的。

      但是密码散列应该明确处理。例如,如果使用 SHA 哈希,则可以使用ShaPasswordEncoder.encodePassword()

      【讨论】:

        【解决方案3】:

        在 Spring Security 中没有用于创建用户的内置功能。它仅用于根据尝试登录和访问资源的用户的规则来保护资源。

        【讨论】:

        • 谢谢 - 所以基本上,正确的方法是使用我的 DAO 更新适当的 Spring 安全表?
        • 是的。你应该有单独的控制器/进程来处理注册
        【解决方案4】:

        要使用哈希算法,您可以将<password-encoder> 添加到<authentication-provider>

        【讨论】:

        • 这将如何影响添加新用户的过程?大概会有一个表单,用户输入用户名和密码等。然后这些将被插入到数据库中。所以我不确定使用 会如何影响这一点?我假设我需要在插入之前手动散列密码。
        • <密码编码器>仅用于授权过程。它将帮助您将用户输入的密码与数据库中的密码进行比较。但是数据库中的密码你必须手动散列。
        猜你喜欢
        • 2020-10-24
        • 2011-09-19
        • 2015-11-21
        • 2013-09-12
        • 1970-01-01
        • 2021-06-18
        • 2017-06-05
        • 1970-01-01
        • 2016-10-16
        相关资源
        最近更新 更多