前面章节中用户名、密码、权限都是写在配置文件里的,不能动态的管理用户的权限,大多数时候显然是不行的。这里介绍从其他数据源读取用户的信息,例如从数据库,LDAP 等。只需要给 authentication-provider
提供接口 UserDetailsService
的实现类即可,使用这个类获取用户的信息,涉及以下内容:
- 修改 spring-security.xml 中的 authentication-provider
- 类 UserDetailsService 实现了 Spring Security 的接口 UserDetailsService
- 类 User
- 类 UserService
spring-security.xml
修改
authentication-manager
下的 user-service-ref 为我们自定义的 UserDetailsService
1 |
|
UserDetailsService
UserDetailsService 的作用是根据登录表单中用户的用户名查找用户信息用于身份认证。Spring Security 中授权分 2 步:身份验证 (Authentication),权限验证 (Authorization)
- 用户在登录页面输入 username, password,然后点击登录按钮
- 方法 loadUserByUsername() 使用 username 查找到用户的信息,如密码,权限等
- Spring Security 使用查找到的密码和加密后用户输入的密码进行比较,如果相等,则身份验证成功
- 身份验证成功后,使用用户的权限和页面的访问权限比较,页面的权限配置在
intercept-url
1 | package com.xtuer.security; |
UserService
UserService 用户查找用户信息
1 | package com.xtuer.service; |
User
1 | package com.xtuer.bean; |
测试
- 访问 http://localhost:8080/hello
- 访问 http://localhost:8080/admin
- 输入错误的用户名或密码,观察登陆失败的页面
- 输入正确的用户名和密码,继续登陆
- 访问 http://localhost:8080/logout,观察注销成功的页面