当前位置: 首页 > news >正文

网站建设项目进度表产品宣传推广策划

网站建设项目进度表,产品宣传推广策划,下载网站 源码,移动端网站欣赏文章目录 使用内置的权限表达式PreAuthorizePermissionEvaluator 自定义权限表达式SysMethodSecurityExpressionHandler源码流程 SysMethodSecurityExpressionRoot 使用内置的权限表达式 PreAuthorize 这个用来判断超级管理员的话,还得在表达式上加上或 Permissi…

文章目录

    • 使用内置的权限表达式
      • @PreAuthorize
      • PermissionEvaluator
    • 自定义权限表达式
      • SysMethodSecurityExpressionHandler
        • 源码流程
      • SysMethodSecurityExpressionRoot

使用内置的权限表达式

@PreAuthorize

这个用来判断超级管理员的话,还得在表达式上加上

PermissionEvaluator

本来是想定义一个 PermissionEvaluator,但是发现,写表达式的时候,还得弄2个参数,@PreAuthorize(‘/admin/user/list’,‘user:list’),有点麻烦

package com.zzhua.blog.config.security.auth;import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;import java.io.Serializable;// GlobalMethodSecurityConfiguration 在 afterSingletonsInstantiated 方法中,// 会去容器中寻找 PermissionEvaluator 的bean, 设置到 defaultMethodExpressionHandler 中,// 并且定义了一个 PreInvocationAuthorizationAdvice 的bean, 将刚刚的设置到 defaultMethodExpressionHandler 设置给了这个Advice,//// GlobalMethodSecurityConfiguration 并且定义了aop中的 methodSecurityInterceptor(),会去创建访问决策管理器,// 访问决策管理器会去添加投票器,里面会创建一个 PreInvocationAuthorizationAdviceVoter, 里面会传入上面定义的Advice,//// 所以接下来的流程看这个拦截器就行了,同时,也离不开 MethodSecurityMetadataSourceAdvisor 切面的支持 因此,方法鉴权就是基于Aop的实现,// 用法参考:SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证-https://juejin.cn/post/6844903974546456590#heading-4
@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {@Overridepublic boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {return false;}@Overridepublic boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {return false;}
}

自定义权限表达式

(也可以采用若依的方法,自定义权限表达式,其实就是利用了el表达式,但是通过自定义权限表达式的过程,可以更加清楚security处理方法注解权限时的整个处理过程,我们也可以在这里扩展一些权限通配符匹配的功能)

SysMethodSecurityExpressionHandler

可参考:如何在 Spring Security 中自定义权限表达式

源码流程

此handler 将会被注入到 GlobalMethodSecurityConfiguration#setMethodSecurityExpressionHandler 作为 handler

GlobalMethodSecurityConfiguration 定义了一个 PreInvocationAuthorizationAdvice 的bean, 获取并设置了上面定义的 handler

GlobalMethodSecurityConfiguration 并且定义了aop中的 methodSecurityInterceptor()拦截器,会去创建访问决策管理器

访问决策管理器会去添加投票器(当然,不止这一种投票器),会创建一个 PreInvocationAuthorizationAdviceVoter, 里面会传入上面定义的Advice,

@EnableWebSecurity引入了一个 MethodSecurityMetadataSourceAdvisorRegistrar ,
它创建了 MethodSecurityMetadataSourceAdvisor 切面, 并且指定了上面的拦截器名字作为构造参数, 使用 MethodSecurityMetadataSource 的实现(实现也有多种,通过组合的方式), 确定需要切入的bean(后面从方法中提取权限表达式,也是交给这个来实现)

所以后面的流程就是:

  • 当一个请求来到切入的方法,就会被拦截器处理, MethodSecurityInterceptor 拦截器 会拿到 AOP里面的 MethodInvocation,
  • 然后它会根据方法中的注解, 提取出所需权限, 交给访问决策管理器, 访问决策管理器 再交给 投票器,
  • 因此, 上面创建的投票器 又会交给 advice, advice又交给handler处理, 也就是下面定义的这个handler处理,
  • handler再利用el表达式计算, el会需要一个rootObject, 具体方法可以定义在rootObject里面, 只需要返回布尔值即可
package com.zzhua.blog.config.security.auth;import org.aopalliance.intercept.MethodInvocation;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations;
import org.springframework.security.authentication.AuthenticationTrustResolverImpl;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;/*可参考:如何在 Spring Security 中自定义权限表达式-https://juejin.cn/post/7119086250610409508此handler 将会被注入到 GlobalMethodSecurityConfiguration#setMethodSecurityExpressionHandler 作为 handlerGlobalMethodSecurityConfiguration 定义了一个 PreInvocationAuthorizationAdvice 的bean, 获取并设置了上面定义的 handlerGlobalMethodSecurityConfiguration 并且定义了aop中的 methodSecurityInterceptor()拦截器,会去创建访问决策管理器访问决策管理器会去添加投票器(当然,不止这一种投票器),会创建一个 PreInvocationAuthorizationAdviceVoter, 里面会传入上面定义的Advice,@EnableWebSecurity引入了一个 MethodSecurityMetadataSourceAdvisorRegistrar ,它创建了 MethodSecurityMetadataSourceAdvisor 切面, 并且指定了上面的拦截器名字作为构造参数,使用 MethodSecurityMetadataSource 的实现(实现也有多种,通过组合的方式), 确定需要切入的bean(后面从方法中提取权限表达式,也是交给这个来实现)所以后面的流程就是:当一个请求来到切入的方法,就会被拦截器处理, MethodSecurityInterceptor 拦截器 会拿到 AOP里面的 MethodInvocation,然后它会根据方法中的注解, 提取出所需权限, 交给访问决策管理器, 访问决策管理器 再交给 投票器,因此, 上面创建的投票器 又会交给 advice, advice又交给handler处理, 也就是下面定义的这个handler处理,handler再利用el表达式计算, el会需要一个rootObject, 具体方法可以定义在rootObject里面, 只需要返回布尔值即可
*/
@Component
public class SysMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler implements MethodSecurityExpressionHandler {@Overrideprotected MethodSecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication,MethodInvocation invocation) {// 换成自己的实现,其它的都照抄源码里面的(下面又多了可以很多自定义的东西了)SysMethodSecurityExpressionRoot root = new SysMethodSecurityExpressionRoot(authentication);root.setThis(invocation.getThis());root.setPermissionEvaluator(getPermissionEvaluator());root.setTrustResolver(new AuthenticationTrustResolverImpl());root.setRoleHierarchy(getRoleHierarchy());// root.setDefaultRolePrefix("ROLE_");return root;}}

SysMethodSecurityExpressionRoot

package com.zzhua.blog.config.security.auth;import com.zzhua.blog.config.constant.SysConstants;
import com.zzhua.blog.config.security.UserDetailDTO;
import com.zzhua.blog.util.SecurityUtil;
import org.springframework.security.access.expression.SecurityExpressionRoot;
import org.springframework.security.access.expression.method.MethodSecurityExpressionOperations;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;class SysMethodSecurityExpressionRootextends SecurityExpressionRootimplements MethodSecurityExpressionOperations {private Object filterObject;private Object returnObject;private Object target;SysMethodSecurityExpressionRoot(Authentication a) {super(a);}/* 自定义鉴权方法 */public boolean isAuth(String permission) {UserDetailDTO userDetailDTO = SecurityUtil.getPrincipal();if (SysConstants.IS_ADMIN.equals(userDetailDTO.getIsAdmin())) {return true;} else {List<String> authories = getAuthories();for (String authory : authories) {if (Objects.equals(authory, permission)) {return true;}}}return false;}private List<String> getAuthories() {Collection<? extends GrantedAuthority> authorities = getAuthentication().getAuthorities();List<String> authoritys = authorities.stream().map(GrantedAuthority::getAuthority).collect(Collectors.toList());return authoritys;}public void setFilterObject(Object filterObject) {this.filterObject = filterObject;}public Object getFilterObject() {return filterObject;}public void setReturnObject(Object returnObject) {this.returnObject = returnObject;}public Object getReturnObject() {return returnObject;}void setThis(Object target) {this.target = target;}public Object getThis() {return target;}
}
http://www.hkea.cn/news/767407/

相关文章:

  • 国外手做网站搜索引擎推广的关键词
  • 网站建设商标注册多少类目域名注册免费
  • 哪里有网站设计公司长沙网络公司最新消息
  • 试描述一下网站建设的基本流程百度怎么发布短视频
  • 我现在有域名怎么做网站搜索关键词热度
  • 海外如何 淘宝网站建设快速seo整站优化排行
  • 代还信用卡网站建设赣州seo顾问
  • 响应式网站建设推广开网店
  • 成都专业网站推广公司优化大师优化项目有
  • 怎么用wordpress搭建网站百度关键词排名点
  • 外挂网站模板域名搜索引擎入口
  • 手机网站开发 pdfseo搜索引擎优化工作内容
  • 上海中小网站建设洛阳seo博客
  • 南宁网站建设公司哪家专业搜索引擎优化包括
  • 新疆住房与建设厅网站新产品推广方式有哪些
  • 做网站站怎么赚钱网络营销模式有哪些?
  • 南通城市建设集团有限公司网站南京谷歌推广
  • 南通网站定制方案怎么查找关键词排名
  • 权大师的网站是哪个公司做的百度做个人简介多少钱
  • 烟台网站建设设计软文广告经典案例100字
  • 做微信用什么网站广州百度seo代理
  • 网站建设目标 优帮云跨境电商营销推广
  • 郑州华恩科技做网站怎么样竞价排名适合百度吗
  • flask做大型网站开发深圳seo博客
  • 合肥网站建设平台小程序怎么引流推广
  • 做网站被拘留免费找客源软件
  • 门户型网站建设百度seo快速提升排名
  • 印度做杂质的网站如何进行网络推广
  • 建设厅八大员兴安盟新百度县seo快速排名
  • 南京网站建设索q.479185700小说排行榜百度