美文网首页
spring security 4.2.2 动态加载用户验证信息

spring security 4.2.2 动态加载用户验证信息

作者: 凌云v | 来源:发表于2017-05-05 09:49 被阅读0次

使用spring security加载用户验证信息一般有三种方式:

  • 将用户信息写死在security配置文件中,只适合玩具应用。
  • 将数据库信息配置在security配置文件中,让security自己去数据库中加载,限制较大,自由度不高,不推荐。
  • 自定义UserDetailsService,动态加载用户信息,推荐。

下文主要介绍如何去自定义一个自己的UserDetailsService,用以实现动态加载用户验证信息。

基本环境搭建

搭建spring security基本开发环境,见该文章:spring security基本开发环境搭建
项目目录基本如下图所示:

项目工程目录结构

创建MGrantedAuthority.class

创类MGrantedAhuthority,实现GrantedAuthority接口,用作验证权限的载体。

public class MGrantedAuthority implements GrantedAuthority {
    // 权限信息
    private String authority;

    /**
     * 构造函数
     * 
     * @param authority
     */
    public MGrantedAuthority(String authority) {
        this.authority = authority;
    }

    /**
     * 获取权限信息
     */
    public String getAuthority() {
        return authority;
    }
}

创建MUserDetails.class

创建类MUserDeatils,实现UserDetails接口,用作用户验证信息的载体。

public class MUserDetails implements UserDetails {
    // 用户名
    private String username;
    // 密码
    private String password;
    // 权限集合
    private Set<MGrantedAuthority> authorities;

    /**
     * 构造函数
     * 
     * @param username
     * @param password
     * @param authorities
     */
    public MUserDetails(String username, String password, Set<MGrantedAuthority> authorities) {

        this.username = username;
        this.password = password;
        this.authorities = authorities;
    }

    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    public String getPassword() {
        return password;
    }

    public String getUsername() {
        return username;
    }

    // 账户是否没有过期
    public boolean isAccountNonExpired() {
        return true;
    }

    // 账户是否没有被锁
    public boolean isAccountNonLocked() {
        return true;
    }

    // 资格是否没有过期
    public boolean isCredentialsNonExpired() {
        return true;
    }

    // 该用户信息是否可用
    public boolean isEnabled() {
        return true;
    }
}

创建MUserDetailsService

创建类MUserDetailsService,实现UserDetailsService接口,查询并返回用户验证信息。

public class MUserDetailsService implements UserDetailsService {

    /**
     * 根据用户名加载用户密码和权限信息
     */
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // TODO 数据库查询用户信息和数据库信息

        // 模拟构建密码,此处应该数据库查询
        String password = username;
        // 模拟构建权限,此处应该数据库查询
        Set<MGrantedAuthority> authorities = new HashSet<MGrantedAuthority>();
        authorities.add(new MGrantedAuthority("ROLE_USER"));
        authorities.add(new MGrantedAuthority("ROLE_ADMIN"));
        // 构建用户信息
        MUserDetails userDetails = new MUserDetails(username, password, authorities);
        // 返回用户信息
        return userDetails;
    }
}

修改spring security配置文件

修改security.xml文件,修改内容如下:

<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="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.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">


    <http pattern="/login.jsp" security="none" />

    <http use-expressions="true">

        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        
        <!-- 自定义登录界面 -->
        <form-login 
            authentication-failure-url="/login.jsp"
            login-page="/login.jsp" 
            default-target-url="/index.jsp"
            login-processing-url="/j_spring_security_check" />
            
        <csrf disabled="true" />
    </http>

    <!-- 2、更改验证信息加载方式 -->
    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="mUserDetailsService">
        </authentication-provider>
    </authentication-manager>

    <!-- 1、配置自定义类MUserDetailsService -->
    <b:bean id="mUserDetailsService" class="com.sfq.MUserDetailsService" />
</b:beans>

部署项目

项目运行结果示例

运行结果示例

源码

点击下载源码

相关文章

网友评论

      本文标题:spring security 4.2.2 动态加载用户验证信息

      本文链接:https://www.haomeiwen.com/subject/kbsjtxtx.html