权限 - adongs/security-manager-spring-boot-starter GitHub Wiki

权限

用户权限

@Certification (判断权限和角色)

参数名称 类型 说明 默认值
permissions String[] 权限组
plogical Certification.Logical 关系
Certification.Logical.AND 并且
Certification.Logical.OR 或
Certification.Logical.AND
roles String[] 角色组
rlogical Certification.Logical 关系
Certification.Logical.AND 并且
Certification.Logical.OR 或
Certification.Logical.AND

@Sightseer(游客:不检查用户token)

参数名称 类型 说明 默认值

相关配置

配置名称 类型 说明 默认值
spring.security.manager.request.enabled boolean 开启权限注解 true
spring.security.manager.request.token String 请求token的key,在header中获取 token

用法

  • 1.实现 DataSource 接口,自定义权限和用户token验证,DefaultDataSource为默认实现的用例,可以参考 建议写一个service

  • 2.设置spring.security.manager.request.enabled为true,默认为true

  • 3.编写一个controller(下面的接口如果没有合格token是无法访问)

@Controller
@RequestMapping("test")
public class TestController {

    @PostMapping("user")
    public User user(){
        return new User();
    }
}
{
    "timestamp": "2020-04-30T14:53:06.963+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "token invalid",
    "path": "/test/user"
}
  • 5.自定义异常响应信息如下
@RestControllerAdvice
public class Exceptions {

    @ExceptionHandler(TokenException.class)
    public String token(TokenException exception){
        return exception.getMessage();
    }
}
  • 6.想对接口设置访问权限或者访问角色,可以使用@Certification注解,如下要求用户必须同时拥有admin和user角色,同时权限必须有select和update
@Controller
@RequestMapping("test")
public class TestController {

    @PostMapping("user")
    @Certification(roles = {"admin","user"},permissions = {"select","update"})
    public User user(){
        return new User();
    }
}
  • 7.如果只想用户角色满足一个即可和权限满足一个就行,可以设置如下Certification.Logical.AND表示并且 Certification.Logical.OR表示或者
@Controller
@RequestMapping("test")
public class TestController {

    @PostMapping("user")
    @Certification(roles = {"admin","user"},rlogical = Certification.Logical.OR,permissions = {"select","update"},plogical = Certification.Logical.OR)
    public User user(){
        return new User();
    }
}
  • 8.角色和权限支持ant风格匹配
@Controller
@RequestMapping("test")
public class TestController {

    @PostMapping("user")
    @Certification(roles = {"admin:*","user:test:*"},rlogical = Certification.Logical.OR,permissions = {"select:user:*","update:*"},plogical = Certification.Logical.OR)
    public User user(){
        return new User();
    }
}
  • 9.想对TestController下面所有的mapper设置权限和角色如下
@Controller
@RequestMapping("test")
@Certification(roles = {"admin","user"},permissions = {"select","update"})
public class TestController {

    @PostMapping("user")
    public User user(){
        return new User();
    }
}
  • 10.如果你想对某个接口不验证token(@Sightseer 表示不验证token,只能在controller层使用)
@Controller
@RequestMapping("test")
public class TestController {

    @PostMapping("user")
    @Sightseer
    public User user(){
        return new User();
    }
}
  • 11.@Certification和@Sightseer可以在方法和类上面使用,优先级如下
优先级:方法@Certification > 方法@Sightseer > 类@Certification > 类@Sightseer
  • 12.忽略指定的url(同样也支持ant风格匹配)
spring.security.manager.request.ignore-url="*.js","*.png","*.jpg"
  • 13.获取当前登录的用户信息
@Controller
@RequestMapping("test")
public class TestController {

    @PostMapping("user")
    public User user(){
           //获取登录者的终端
            Terminal terminal = Terminal.get();
            //获取登录信息
            User user = terminal.getUser();
        return user;
    }
}

资源权限

对资源权限控制,比如图片,excel,或者部分展示数据,都可以看做资源,如果想给项目以外的人访问,还要限定只能今天访问,这样的控制在用户权限的体系难以实现,现在只需要在controller加上@Resources注解即可实现对资源的控制

@Resources (对资源的授权)

参数名称 类型 说明 默认值
permissions String[] 权限组
plogical Certification.Logical 关系
Certification.Logical.AND 并且
Certification.Logical.OR 或
Certification.Logical.AND

相关配置

配置名称 类型 说明 默认值
spring.security.manager.request.resources.enabled boolean 开启对资源的权限控制 false
spring.security.manager.request.resources.mode JwtAlgorithm 加密方式(必须填写)
spring.security.manager.request.resources.key string 对称加密方式的秘钥
spring.security.manager.request.resources.private-key string 非对称加密的私钥路径
spring.security.manager.request.resources.public-key string 非对称加密的公钥路径
spring.security.manager.request.resources.resources string 获取标识的key,默认获取header的resources如果为空获取param中的resources resources

用法

  • 1.配置相关的参数,这里使用对称加密(秘钥一定好保存好)
spring.security.manager.request.resources.enabled=true
spring.security.manager.request.resources.mode=hmac384
spring.security.manager.request.resources.key=123456ui8765432
spring.security.manager.request.resources.resources=resources
  • 2.生成有效的令牌
@Controller
@RequestMapping("test")
public class TestController {

    @Autowired
    private ResourcesJwtProcessor resourcesJwtProcessor;

    @PostMapping("get")
    @ResponseBody
    public String getData(){
        User user = new User();
        user.setId("1");
        Date now = new Date();
        Date hours = DateUtils.setHours(now, 2);
        //设置令牌有效时间为2小时,并给与一个"query"权限
        return defaultResourcesJwtProcessor.create(user,null,null,hours,null,null,"query");
    
    }
}
  • 2.在conllect中加上@Resources注解即可
    @GetMapping("query")
    @ResponseBody
    @Resources(permissions = {"query"})
    public String query(){
        return "ok";
    }
⚠️ **GitHub.com Fallback** ⚠️