使用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>
部署项目
项目运行结果示例