在 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 Boot 库的上下文中添加新的 spring-security 链过滤器的预期方法
:REST spring security - 手动验证新用户并获取访问令牌