程序员人生 网站导航

Spring Security身份认证之UserDetailsService

栏目:框架设计时间:2015-05-08 08:10:03

    zhiqian我们采取了配置文件的方式从数据库中读取用户进行登录。虽然该方式的灵活性相较于静态账号密码的方式灵活了许多,但是将数据库的结构暴露在明显的位置上,绝对不是1个明智的做法。本文通过Java代码实现UserDetailsService接口来实现身份认证。


    1.1 UserDetailsService在身份认证中的作用


    Spring Security中进行身份验证的是AuthenticationManager接口,ProviderManager是它的1个默许实现,但它其实不用来处理身份认证,而是拜托给配置好的AuthenticationProvider,每一个AuthenticationProvider会轮番检查身份认证。检查后或返回Authentication对象或抛出异常。


    验证身份就是加载响应的UserDetails,看看是不是和用户输入的账号、密码、权限等信息匹配。此步骤由实现AuthenticationProvider的DaoAuthenticationProvider(它利用UserDetailsService验证用户名、密码和授权)处理。包括 GrantedAuthority 的 UserDetails对象在构建 Authentication对象时填入数据。


1.2 配置UserDetailsService


    1.2.1 更改Spring-Security.xml中身份的方式,使用自定义的UserDetailsService。

1.2 配置UserDetailsService


    1.2.1 更改Spring-Security.xml中身份的方式,使用自定义的UserDetailsService。


1
<span style="font-family:arial, helvetica, sans-serif;"><security:authentication-manager><br>  <security:authentication-provider user-service-ref="favUserDetailService"><br>      </security:authentication-provider><br> </security:authentication-manager><br><br> <bean id="favUserDetailService" class="com.favccxx.favsecurity.security.FavUserDetailService" /><br></span>


    

    1.2.2 新建FavUserDetailsService.java,实现UserDetailsService接口。为了下降学习的难度,这里并没有与数据库进行集成,而是采取摹拟从数据库中获得用户的方式进行身份验证。示例代码以下:


1
<span style="font-family:arial, helvetica, sans-serif;">package com.favccxx.favsecurity.security;<br><br>import java.util.ArrayList;<br>import java.util.Collection;<br>import java.util.List;<br><br>import org.apache.logging.log4j.LogManager;<br>import org.apache.logging.log4j.Logger;<br>import org.springframework.security.core.GrantedAuthority;<br>import org.springframework.security.core.authority.SimpleGrantedAuthority;<br>import org.springframework.security.core.userdetails.User;<br>import org.springframework.security.core.userdetails.UserDetails;<br>import org.springframework.security.core.userdetails.UserDetailsService;<br>import org.springframework.security.core.userdetails.UsernameNotFoundException;<br><br>public class FavUserDetailService implements UserDetailsService {<br><br> private static final Logger logger = LogManager.getLogger(FavUserDetailService.class);<br><br>  /**<br>  * 根据用户名获得用户 - 用户的角色、权限等信息<br>   */<br> 
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐

1Excel的筛选的使用技巧 2Rails在MacOS上搭建Heroku部署环境 3Spring(十二)AspectJ框架开发AOP(基于注解) 4MacOS下安装rvm的几点注意 5mysql 协议的退出命令包及解析 6深入浅出Mybatis-分页 7Spring(十一)AspectJ框架开发AOP(基于xml)