1. 说明

security 鉴权方式常用的有两种配置,1、配置文件中配置;2、使用注解标注;他们都是基于 acess 表达式,如果需要自定义逻辑的鉴权认证,只需要自定义 access 表达式即可。本文只选取注解的方式,来讲解默认的 access 和自定义的 access 表达式

2.基于注解的使用

2.1 使用前提条件:

注解默认不可用,通过开启注解:在配置类中开启注解 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)

  • @Secured:专门判断用户是否具有角色,可以写在方法或类上,参数以 ROLE_ 开头
  • @PreAuthorize\PostAuthorize: PreAuthorize 访问的类或方法执行前判断权限,而 PostAuthorize 在执行之后,Post 基本不用;允许与 ROLE_ 开头。

2.2 基于默认的access表达式

在登录的时候,需要将用户权限返回给security;security才能实现权限控制功能;

具体步骤:

登录时,实现 UserDetailService,重写 loadUserByUsername(String userName)方法。根据 userName 来实现自己的业务逻辑返回 UserDetails 的实现类,需要自定义 User 类实现 UserDetails,比较重要的方法是 getAuthorities(),用来返回该用户所拥有的权限

@Data
public class LoginUser implements UserDetails, Serializable {
...
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// 根据自定义逻辑来返回用户权限,如果用户权限返回空或者和拦截路径对应权限不同,验证不通过
if (!permissions.isEmpty()) {
List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
for (String temp : permissions) {
GrantedAuthority au = new SimpleGrantedAuthority(temp);
list.add(au);
}
return list;
}
return null;
}
}

然后在需要权限控制的controller方法上,添加注解@PreAuthorize("hasAuthority('..*')");其中@PreAuthorize括号中就是access表达式。具体默认的有哪些请参考官网。

@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private ISysUserService userService;
@Autowired
private PermissionService permissionService; @PreAuthorize("hasAuthority('*.*.*')")
@RequestMapping("userList")
public ResultVo queryUserList() {
List<SysUser> list = userService.list();
List<UserVo> result = list.stream().map(item -> permissionService.getUserInfo(item)).collect(Collectors.toList());
return ResultVo.success(result);
}
}

2.3 自定义access表达式

自定义权限认证业务逻辑,然后将该方法标注到注解上

package com.nanboone.framework.security.service;

import java.util.Set;

import com.nanboone.common.utils.ServletUtils;
import com.nanboone.framework.security.domain.LoginUser;
import com.nanboone.framework.token.JwtTokenUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; /**
* AuthorityPermissionService:自定义access表达式,鉴权验证。
* 可以将自定义的access添加到配置类中:http.anyRequest.access(aps.hasPermission(xxx,xxx));
* 也可以直接使用注解@PreAuthorize:@PreAuthorize(aps.hasPermission(xxx));
*
* @Author: dangbo
* @Date: 2021/5/20 10:12
*/
@Service("aps")
public class AuthorityPermissionService { @Autowired
JwtTokenUtils jwtTokenUtils; public boolean hasPermission(String permissions) {
if (StringUtils.isEmpty(permissions)) {
return false;
}
// 用户信息对象
LoginUser loginUser = jwtTokenUtils.getLoginUser(ServletUtils.getRequest());
if (loginUser == null || CollectionUtils.isEmpty(loginUser.getPermissions())) {
return false;
}
Set<String> authorities = loginUser.getPermissions();
for (String permission : permissions.split(",")) {
if (StringUtils.isNotEmpty(permission) && hasPermissions(authorities, permission)) {
return true;
}
}
return false;
} private boolean hasPermissions(Set<String> authorities, String permission) {
return authorities.contains("*.*.*") || authorities.contains(permission.trim());
}
} @RestController
@RequestMapping("test")
public class TestController {
@Autowired
private ISysUserService userService;
@Autowired
private PermissionService permissionService; @PreAuthorize("@aps.hasPermission('*.*.*')")
@RequestMapping("userList")
public ResultVo queryUserList() {
List<SysUser> list = userService.list();
List<UserVo> result = list.stream().map(item -> permissionService.getUserInfo(item)).collect(Collectors.toList());
return ResultVo.success(result);
}
}

springboot security 权限控制 -- @PreAuthorize 的使用的更多相关文章

  1. Spring Security权限控制

    Spring Security官网 : https://projects.spring.io/spring-security/ Spring Security简介: Spring Security是一 ...

  2. 自定义Spring Security权限控制管理(实战篇)

    上篇<话说Spring Security权限管理(源码)>介绍了Spring Security权限控制管理的源码及实现,然而某些情况下,它默认的实现并不能满足我们项目的实际需求,有时候需要 ...

  3. security权限控制

    目录 前言 数据库和dimain 静态页面 配置文件 web.xml引入 service校验方法 用户名的获取 不同角色访问控制权限 jsp页面 后台 前言 spring自带角色权限控制框架 用户-角 ...

  4. Spring Security教程之基于表达式的权限控制(九)

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

  5. spring security 3.1 实现权限控制

    spring security 3.1 实现权限控制 简单介绍:spring security 实现的权限控制,能够分别保护后台方法的管理,url连接訪问的控制,以及页面元素的权限控制等, secur ...

  6. Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制

    思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...

  7. springboot整合security实现基于url的权限控制

    权限控制基本上是任何一个web项目都要有的,为此spring为我们提供security模块来实现权限控制,网上找了很多资料,但是提供的demo代码都不能完全满足我的需求,因此自己整理了一版. 在上代码 ...

  8. Spring Security 动态url权限控制(三)

    一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...

  9. Spring Security(17)——基于方法的权限控制

    目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-25 ...

  10. Spring Security(16)——基于表达式的权限控制

    目录 1.1      通过表达式控制URL权限 1.2      通过表达式控制方法权限 1.2.1     使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2   ...

随机推荐

  1. Java 图片、文件 Base64 互转

    Java 图片.文件 Base64 互转 package com.thoth.his.base.util; import java.io.FileInputStream; import java.io ...

  2. cmd 7z 文件压缩

    7z压缩测试 为了方便,将7z的安装目录,添加到环境变量中 # 不加环境变量的话,需要带上全路径 C:\Users\vipsoft>"C:\\Program Files\\7-Zip\ ...

  3. 🤗Hugging Face 87个 AI 游戏可以在线玩啦

    7月9日结束的开源游戏挑战赛有超过来自全球 1000 多名开发者参加 一共收录了 87 个游戏 目前已经进入投票期 视频中的:猜名画 ️ 用了之前推荐的 LEDITS 目前得分很高呢 来试试看你能猜对 ...

  4. 跟着老猫来搞GO,系好安全带,准备发车!

    为什么想要开篇这么一个系列博客主题? 我想有很多小伙伴想要问我这个,其实主要有以下几个原因. 在粉丝面前丢脸了 之前写过几篇关于java分布式系统的一些坑,然后就有小伙伴挺崇拜的,认为老猫啥都会,甚至 ...

  5. Tomcat 9.0.26 高并发场景下DeadLock问题排查与修复

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/-OcCDI4L5GR8vVXSYhXJ7w作者:黄卫兵.陈锦霞 一.Tomcat容器 9.0. ...

  6. Java内部类详解--成员内部类,局部内部类,匿名内部类,静态内部类

    一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...

  7. 如何在编码阶段减少代码中的bug?

    前言 作为一名合格的程序员,不写bug是不可能的.如何花费最少的时间来修复bug呢? 在编码阶段借助一些静态分析工具往往可以事半功倍,减少代码中的bug. 静态分析工具能够在代码未运行的情况下分析源代 ...

  8. P1216-DP【橙】

    在这道题中,我第一次用了memset,确实方便,不过需要注意的是只有全部赋值-1和0的时候才能使用它,否则他能干出吓死人的事.以及memset在cstring头文件里,在本地就算不include也能照 ...

  9. IDEA插件Material Theme UI 激活

    介绍 "Material Theme UI" 是一款为 IntelliJ IDEA 提供现代化材料设计主题的插件,通过重新设计IDE的外观,为开发人员带来更加美观.富有活力的用户体 ...

  10. Deployment 和 StatefulSets 概述

    这篇概述是看文章提到的一段话 xxx is not targeted to be horizontally scalable 引发的,遂整理记录在这里. 起因是有两个应用,一个是无状态的,可以 hor ...