详解Spring Security进阶身份认证之UserDetailsService(附源码)
2015-01-29 17:33
609 查看
在上一篇Spring Security身份认证博文中,我们采用了配置文件的方式从数据库中读取用户进行登录。虽然该方式的灵活性相较于静态账号密码的方式灵活了许多,但是将数据库的结构暴露在明显的位置上,绝对不是一个明智的做法。本文通过Java代码实现UserDetailsService接口来实现身份认证。
1.1 UserDetailsService在身份认证中的作用
Spring Security中进行身份验证的是AuthenticationManager接口,ProviderManager是它的一个默认实现,但它并不用来处理身份认证,而是委托给配置好的AuthenticationProvider,每个AuthenticationProvider会轮流检查身份认证。检查后或者返回Authentication对象或者抛出异常。
验证身份就是加载响应的UserDetails,看看是否和用户输入的账号、密码、权限等信息匹配。此步骤由实现AuthenticationProvider的DaoAuthenticationProvider(它利用UserDetailsService验证用户名、密码和授权)处理。包含 GrantedAuthority 的 UserDetails对象在构建 Authentication对象时填入数据。
1.2 配置UserDetailsService
1.2.1 更改Spring-Security.xml中身份的方式,使用自定义的UserDetailsService。
1.2.2 新建FavUserDetailsService.java,实现UserDetailsService接口。为了降低学习的难度,这里并没有与数据库进行集成,而是采用模拟从数据库中获取用户的方式进行身份验证。示例代码如下:
1.2.3 启动应用服务器,只要用户名和密码不全是favccxx,就会产生下面的错误。
用户名和密码都输入favccxx,则登陆成功
1.3 跟踪UserDetailsService。
身份认证的调用流程图如下,用户可下载Spring Security源代码跟踪调试。
1.4 如不能正常运行,点这里看看源代码吧。
本文出自 “这个人的IT世界” 博客,请务必保留此出处http://favccxx.blog.51cto.com/2890523/1609692
1.1 UserDetailsService在身份认证中的作用
Spring Security中进行身份验证的是AuthenticationManager接口,ProviderManager是它的一个默认实现,但它并不用来处理身份认证,而是委托给配置好的AuthenticationProvider,每个AuthenticationProvider会轮流检查身份认证。检查后或者返回Authentication对象或者抛出异常。
验证身份就是加载响应的UserDetails,看看是否和用户输入的账号、密码、权限等信息匹配。此步骤由实现AuthenticationProvider的DaoAuthenticationProvider(它利用UserDetailsService验证用户名、密码和授权)处理。包含 GrantedAuthority 的 UserDetails对象在构建 Authentication对象时填入数据。
1.2 配置UserDetailsService
1.2.1 更改Spring-Security.xml中身份的方式,使用自定义的UserDetailsService。
<security:authentication-manager> <security:authentication-provider user-service-ref="favUserDetailService"> </security:authentication-provider> </security:authentication-manager> <bean id="favUserDetailService" class="com.favccxx.favsecurity.security.FavUserDetailService" />
1.2.2 新建FavUserDetailsService.java,实现UserDetailsService接口。为了降低学习的难度,这里并没有与数据库进行集成,而是采用模拟从数据库中获取用户的方式进行身份验证。示例代码如下:
package com.favccxx.favsecurity.security; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; public class FavUserDetailService implements UserDetailsService { private static final Logger logger = LogManager.getLogger(FavUserDetailService.class); /** * 根据用户名获取用户 - 用户的角色、权限等信息 */ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { UserDetails userDetails = null; try { com.favccxx.favsecurity.pojo.User favUser = new com.favccxx.favsecurity.pojo.User(); favUser.setUsername("favccxx"); favUser.setPassword("favccxx"); Collection<GrantedAuthority> authList = getAuthorities(); userDetails = new User(username, favUser.getPassword().toLowerCase(),true,true,true,true,authList); } catch (Exception e) { e.printStackTrace(); } return userDetails; } /** * 获取用户的角色权限,为了降低实验的难度,这里去掉了根据用户名获取角色的步骤 * @param * @return */ private Collection<GrantedAuthority> getAuthorities(){ List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(); authList.add(new SimpleGrantedAuthority("ROLE_USER")); authList.add(new SimpleGrantedAuthority("ROLE_ADMIN")); return authList; } }
1.2.3 启动应用服务器,只要用户名和密码不全是favccxx,就会产生下面的错误。
用户名和密码都输入favccxx,则登陆成功
1.3 跟踪UserDetailsService。
身份认证的调用流程图如下,用户可下载Spring Security源代码跟踪调试。
1.4 如不能正常运行,点这里看看源代码吧。
本文出自 “这个人的IT世界” 博客,请务必保留此出处http://favccxx.blog.51cto.com/2890523/1609692
相关文章推荐
- Spring Security进阶身份认证之使用数据库中的用户进行身份认证(附源码)
- Spring Security身份认证之HelloSpringSecurity(附源码)
- Spring Security 4.1.3 实现UserDetailsService,实现登陆验证、会话管理
- 自定义 Spring Security 4 的UserDetailsService和UserDetails
- Spring Security身份认证之UserDetailsService
- Spring security +Hibernate+UserDetailsService认证
- Spring Security 实现身份认证
- 简单继承UserDetailsService
- puppet进阶指南——user资源详解
- Spring Security 取Session中的值和修改userDetails(转)
- IntentService源码详解
- 《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService)
- Android入门进阶教程(16)-ActivityThead、ActivityManagerService 详解
- spring security2认证详解说明
- Android IntentService源码详解
- php创建基本身份认证站点的方法详解
- Spring Security3源码分析(7)-UsernamePasswordAuthenticationFilter分析
- ASP.NET Forms身份认证 详解
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现统一身份认证(Single Sign On,单点登录)附源码
- RADIUS:远程用户拨入认证系统(Remote Authentication Dial In User Service)