美文网首页
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