一、WebSecurityConfigurerAdapter 总配置类:
1、介绍:配置类
2、主要方法:
(1)configure(HttpSecurity http)
protected void configure(HttpSecurity http) throws Exception {
this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
((HttpSecurity)((HttpSecurity)((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated().and()).formLogin().and()).httpBasic();
}
可以看到 WebSecurityConfigurerAdapter 已经默认声明了一些安全特性:
① 验证所有用户请求;
② 允许用户使用表单登录进行身份验证(Spring Security 提供了一个简单的表单登录页面);
③ 允许用户使用 HTTP 基本认证。
3、使用方法:自定义一个类如WebSecurityConfig 继承WebSecurityConfigurerAdapter抽象类,WebSecurityConfig 类上加上 @EnableWebSecurity 注解后,便会自动被 Spring 发现并注册(点击 @EnableWebSecurity 注解可以看到 @Configuration 注解已经存在,所以此处不需要额外添加)。
二、HttpSecurity:
1、作用: HttpSecurity 实际上对应了 Spring Security 命名空间配置方式中 xml 文件内的标签。允许我们为特定的 http 请求配置安全策略。HttpSecurity 首先被设计为链式调用,在执行每个方法后,都会返回一个预期的上下文,便于连续调用,除非使用 and() 方法结束当前标签,上下文才会回到 HttpSecurity ,否则链式调用的上下文将自动进入对应的标签域。
2、主要方法: HttpSecurity 提供了很多配置相关的方法,分别对应命名空间配置中的子标签
(1)authorizeRequests():对应
(2)formLogin():对应
(3)httpBasic() :对应
(4) csrf() :对应
三、认证数据源UserDetailsService :
1、介绍:Spring Security 支持各种来源的用户数据,包括内存、数据库、LDAP 等。它们被抽象为一个 UserDetailsService 接口,任何实现了 UserDetailsService 接口的对象都可以作为认证数据源。在这种设计模式下,Spring Security 显得尤为灵活。
package org.springframework.security.core.userdetails;
public interface UserDetailsService {
UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}
2、实现类:
(1)InMemoryUserDetailsManager :将用户数据源寄存在内存里,在一些不需要引入数据库这种重数据源的系统中很有帮助。
(2)JdbcUserDetailsManager:
(3)自定义实现类:实现UserDetailsService接口。如
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
@Service("jwtUserService")
public class JwtUserServiceImpl implements UserDetailsService {
@Autowired
private UserDOMapper userDOMapper;
@Autowired
private UserMenuMapper userMenuMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDO userDO = userDOMapper.getNonFieldAccountByAccountOrPhone(username);
if(userDO == null){
throw new UsernameNotFoundException("用户不存在");
}
// 查询用户菜单权限
List menuVOList = userMenuMapper.listMenuByAccount(username,);
return new JwtUser(userDO.getId(),userDO.getAccount()
userDO.getName(), menuVOList);
}
}
其中的用户对象也重写了:
package com.security.demo.dto;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
public class JwtUser implements UserDetails {
//用户id
private String id;
//用户账号
private String account;
//用户名
private String name;
//菜单
private List menuVOList;
public JwtUser(){
}
public JwtUser(String id,String account,String name,List menuVOList){
this.id = id;
this.account = account;
this.name = name;
this.menuVOList = menuVOList;
}
@Override
public Collection extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return null;
}
@Override
public String getUsername() {
return name;
}
@Override
public boolean isAccountNonExpired() {
return false;
}
@Override
public boolean isAccountNonLocked() {
return false;
}
@Override
public boolean isCredentialsNonExpired() {
return false;
}
@Override
public boolean isEnabled() {
return false;
}
}
3、使用方法:只需要为自定义UserDetailsService数据源类加上@bean 注解,便可被 Spring Security 发现并使用。
四、用户对象UserDetails :
1、介绍:
public interface UserDetails extends Serializable {
Collection extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
2、使用方法:使用时一般实现UserDetails,自定义业务字段即可。如上面的JWTUser。