// 登录认证:只有登录之后才能进入该方法
@SaCheckLogin
@RequestMapping("info")
public String info() {
return "查询用户信息";
}
// 角色认证:必须具有指定角色才能进入该方法
@SaCheckRole("super-admin")
@RequestMapping("add")
public String add() {
return "用户增加";
}
// 权限认证:必须具有指定权限才能进入该方法
@SaCheckPermission("user-add")
@RequestMapping("add")
public String add() {
return "用户增加";
}
// 二级认证:必须二级认证之后才能进入该方法
@SaCheckSafe()
@RequestMapping("add")
public String add() {
return "用户增加";
}
// Http Basic 认证:只有通过 Basic 认证后才能进入该方法
@SaCheckBasic(account = "sa:123456")
@RequestMapping("add")
public String add() {
return "用户增加";
}
package com.xc.satoken.controller;
import cn.dev33.satoken.annotation.*;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/user")
@RestController
public class UserController {
@PostMapping("/login")
public String login(String username,String password){
//模拟登录校验
if("xx".equals(username) && "123456".equals(password)){
StpUtil.login(1001);
return "登陆成功";
}
return "登陆失败";
}
@GetMapping("/isLogin")
public String islogin(){
return "当前会话是否登录:" + StpUtil.isLogin();
}
@GetMapping("/checkLogin")
public String checkLogin(){
StpUtil.checkLogin();
return "已登录";
}
@GetMapping("/hasPerm")
public String hasPermission(){
StpUtil.checkPermission("user:select");
return "true";
// else return "false";
}
@GetMapping("/checkPermAnd")
public String hasPermissionAnd(){
StpUtil.checkPermissionAnd("user:select","user:delete");
return "true";
}
@GetMapping("/hasPermOr")
public String hasPermissionOr(){
if (StpUtil.hasPermissionOr("user:select","user:delete"))
return "true";
else return "false";
}
@GetMapping("/hasRole")
public String hasRole(){
StpUtil.checkRole("user");
return "true";
}
@GetMapping("/checkRoleAnd")
public String hasRoleAnd(){
StpUtil.checkRoleAnd("user","admin");
return "true";
}
@GetMapping("/hasRoleOr")
public String hasRoleOr(){
if (StpUtil.hasRoleOr("user2","admin"))
return "true";
else return "false";
}
@GetMapping("/logout")
public String logout(){
StpUtil.logout(1001);
return "success";
}
@GetMapping("/kickout")
public String kickout(){
StpUtil.kickout(1001);
return "success";
}
@GetMapping("/disable")
public String disable(){
StpUtil.disable(1001, 86400);
return "success";
}
// 登录认证:只有登录之后才能进入该方法
@SaCheckLogin
@RequestMapping("info")
public String info() {
return "查询用户信息";
}
// 角色认证:必须具有指定角色才能进入该方法
@SaCheckRole("admin")
@RequestMapping("add1")
public String add1() {
return "用户增加";
}
// 权限认证:必须具有指定权限才能进入该方法
@SaCheckPermission("user:add")
@RequestMapping("add")
public String add() {
return "用户增加";
}
// 二级认证:必须二级认证之后才能进入该方法
@SaCheckSafe()
@RequestMapping("add2")
public String add2() {
return "用户增加";
}
// Http Basic 认证:只有通过 Basic 认证后才能进入该方法
@SaCheckBasic(account = "xx:123456")
@RequestMapping("add3")
public String add3() {
return "用户增加";
}
// 注解式鉴权:只要具有其中一个权限即可通过校验
@RequestMapping("atJurOr")
@SaCheckPermission(value = {"user:add", "user:all", "user:delete"}, mode = SaMode.OR)
public String atJurOr() {
return "用户信息";
}
// 注解式鉴权:只要具有其中一个权限即可通过校验
@RequestMapping("userAdd")
@SaCheckPermission(value = "user:add", orRole = "admin")
public String userAdd() {
return "用户信息";
}
}
异常处理
package com.xc.satoken.config;
import cn.dev33.satoken.exception.DisableLoginException;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.hutool.json.JSONObject;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestControllerAdvice
public class MyExceptionHandle {
// 全局异常拦截(拦截项目中的NotLoginException异常)
@ResponseBody
@ExceptionHandler(Exception.class)
public String handlerException(Exception e, HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 打印堆栈,以供调试
System.out.println("全局异常---------------");
e.printStackTrace();
// 不同异常返回不同状态码
String aj = null;
if (e instanceof NotLoginException) { // 如果是未登录异常
NotLoginException ee = (NotLoginException) e;
aj = ee.getMessage();
}
else if(e instanceof NotRoleException) { // 如果是角色异常
NotRoleException ee = (NotRoleException) e;
aj = ("无此角色:" + ee.getRole());
}
else if(e instanceof NotPermissionException) { // 如果是权限异常
NotPermissionException ee = (NotPermissionException) e;
aj = ("无此权限:" + ee.getCode());
}
else if(e instanceof DisableLoginException) { // 如果是被封禁异常
DisableLoginException ee = (DisableLoginException) e;
aj = ("账号被封禁:" + ee.getDisableTime() + "秒后解封");
}
else { // 普通异常, 输出:500 + 异常信息
aj = (e.getMessage());
}
// 返回给前端
return aj;
}
}
注解相关
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>测试注解鉴权</title>
</head>
<body>
<form action="/user/login" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" name="登录">
</form>
<br>
<a href="/user/info">登录看查看</a>
<br>
<a href="/user/add1" >admin可看</a>
<br>
<a href="/user/add" >有user:add可看</a>
<br>
<a href="/user/atJurOr" >有"user:add", "user:all", "user:delete"其中之一可看</a>
<br>
<a href="/user/userAdd" >有user:add或是admin可看</a>
<br>
<a href="/user/add2" >必须二级认证之后才能进入该方法 </a>
<br>
<a href="/user/add3" >只有通过 Basic 认证后才能进入该方法</a>
</body>
</html>