在 Spring Security 中添加新用户

Posted

技术标签:

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

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

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

谢谢!

【问题讨论】:

【参考方案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>。

【讨论】:

这将如何影响添加新用户的过程?大概会有一个表单,用户输入用户名和密码等。然后这些将被插入到数据库中。所以我不确定使用 会如何影响这一点?我假设我需要在插入之前手动散列密码。 <密码编码器>仅用于授权过程。它将帮助您将用户输入的密码与数据库中的密码进行比较。但是数据库中的密码你必须手动散列。

以上是关于在 Spring Security 中添加新用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重启 Spring Boot 的情况下使用 Spring Security 添加新用户

如何在运行时将新用户添加到 Spring Security

在 Spring Boot 库的上下文中添加新的 spring-security 链过滤器的预期方法

:REST spring security - 手动验证新用户并获取访问令牌

Grails Spring Security Core 创建新用户

Grails/Spring Security:无法使用新创建的用户登录