最近接触到了国密算法,稍微做了些了解,打算实际应用一下。正好之前权限管理使用的shiro,security没有从头到尾搞过,就打算做一套security+sm2实现自定义token校验登录的东西。
思路是这样的:先搞一套security,不使用jwt,后面再把sm2集成进去,使用redis缓存token进行校验。
第一次写博客,如果乱的话请见谅。
导入security的jar包
<spring.security.version>5.6.0</spring.security.version>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
security基础配置直接参考下面这位,只是有些地方做了下改动。Springboot + Spring Security 实现前后端分离登录认证及权限控制_I_am_Hutengfei的博客-CSDN博客_springboot springsecurity 前后端分离
自定义数据库用户表
用户信息封装类:
import com.zzh.model.SysPermission;
import com.zzh.model.SysUser;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author :zz
* @date :Created in 2021/12/2 10:57
* @description:用户信息封装
*/
public class UserDetail implements UserDetails {
private SysUser user;
private List<SysPermission> permissions;
public UserDetail(SysUser user, List<SysPermission> permissions){
this.user = user;
this.permissions = permissions;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return permissions.stream().map(sysPermission -> new SimpleGrantedAuthority(sysPermission.getPermissionCode())).collect(Collectors.toList());
}
@Override
public String getPassword() {
return user.getPassWord();
}
@Override
public String getUsername() {
return user.getUserName();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
因为我们是自定义的用户表,没有账号过期、锁定等相关的配置,所以UserDetail中的isAccountNonExpired()、isAccountNonLocked()、isCredentialsNonExpired()、isEnabled()全部改为true。权限则继承security的UserDetails后进行重写,将我们查出来的权限列表放进去。密码返回我们自己定义的密码(注意UserDetails中password是小写,坑了我一下)。
WebSecurityConfig中添加.and().csrf().disable()关闭csrf防护,否则post请求会被拦截。
.and().csrf().disable()
集成swagger
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.7</version>
</dependency>
添加swagger配置
&