引入依赖
<!-- 权限校验相关 -->
<sa.token.version>1.37.0</sa.token.version>
<!-- Sa-Token 依赖配置(依赖配置是redis+token) -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId>
<version>${sa.token.version}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>${sa.token.version}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
<version>${sa.token.version}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId>
<version>${sa.token.version}</version>
</dependency>
配置文件
sa-token:
token-name: Authorization
timeout: 2592000
active-timeout: -1
is-concurrent: true
is-share: false
token-style: tik
is-log: true
max-try-times: 100
jwt-secret-key: abcdefghijklmnopqrstuvwxyz
添加配置
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
@Value("${token.secret}")
private String secret;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
}
@Bean
public StpLogic getStpLogicJwt() {
return new StpLogicJwtForSimple();
}
@Autowired
public void setSaJwtTemplate() {
SaJwtUtil.setSaJwtTemplate(new SaJwtTemplate() {
@Override
public String generateToken(JWT jwt, String key) {
String token = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
LoginUser loginUser = BaseContext.getLoginUser();
Map<String, Object> claims = new HashMap<>();
claims.put(Constants.LOGIN_USER_KEY, token);
claims.put(Constants.LOGIN_USER_ID, loginUser.getUserId());
claims.put(Constants.LOGIN_USER_NAME, loginUser.getUser().getUserName());
claims.put(Constants.LOGIN_USER_MAIL,loginUser.getEmail());
claims.put(Constants.LOGIN_USER_AVATAR,loginUser.getAvatar());
return Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS512, secret).compact();
}
});
}
}
@Component
public class SaPermissionImpl implements StpInterface {
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
LoginUser loginUser = BaseContext.getLoginUser();
return new ArrayList<>(loginUser.getMenuPermission());
}
@Override
public List<String> getRoleList(Object loginId, String loginType) {
LoginUser loginUser = BaseContext.getLoginUser();
return new ArrayList<>(loginUser.getRolePermission());
}
}
- @SaCheckLogin: 登录校验 —— 只有登录之后才能进入该方法。
- @SaCheckRole(“admin”): 角色校验 —— 必须具有指定角色标识才能进入该方法。
- @SaCheckPermission(“user:add”): 权限校验 —— 必须具有指定权限才能进入该方法。
- @SaCheckSafe: 二级认证校验 —— 必须二级认证之后才能进入该方法。
- @SaCheckHttpBasic: HttpBasic校验 —— 只有通过 HttpBasic 认证后才能进入该方法。
- @SaCheckHttpDigest: HttpDigest校验 —— 只有通过 HttpDigest 认证后才能进入该方法。
- @SaIgnore:忽略校验 —— 表示被修饰的方法或类无需进行注解鉴权和路由拦截器鉴权。
- @SaCheckDisable(“comment”):账号服务封禁校验 —— 校验当前账号指定服务是否被封禁。
代码测试
@RestController
public class LoginController {
@SaCheckLogin
@RequestMapping("home")
public SaResult home() {
return SaResult.ok("访问成功,此处为登录后才能看到的信息");
}
@RequestMapping("doLogin")
public SaResult doLogin(String name, String pwd) {
if("zhang".equals(name) && "123456".equals(pwd)) {
StpUtil.login(10001);
return SaResult.ok("登录成功");
}
return SaResult.error("登录失败");
}
}
@RestController
@RequestMapping("/at-check/")
public class AtCheckController {
@SaCheckPermission("user.add")
@RequestMapping("checkPermission")
public SaResult checkPermission() {
return SaResult.ok();
}
@SaCheckRole("super-admin")
@RequestMapping("checkRole")
public SaResult checkRole() {
return SaResult.ok();
}
}