spring security如何使用sec:authorize="hasAnyAuthority('PRODUCT_DELETE')"标签 及其在方法上使用权限注解

废话不多说,直接上代码,

第一
首先写一个类继承WebSecurityConfigurerAdapter
我只从代码中粘贴了一部分,
Configuration注解的作用,意思将给类交给spring容器管理(也可以说是被实例化)
EnableWebSecurity的作用,开启spring security过滤器链
EnableGlobalMethodSecurity ,开启权限注解,首先加上此注解,我们的标签及其权限注解才可以使用

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) //开启权限注解,默认是关闭的
public class SecurityConfig extends WebSecurityConfigurerAdapter {

第二
需要在该类中注入自定义PermissionEvaluator,注意我在这里,自定义的类名叫做UserPermissionEvaluator

/**
     * 注入自定义PermissionEvaluator
     */
    @Bean
    public DefaultWebSecurityExpressionHandler userSecurityExpressionHandler(){
        DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
        handler.setPermissionEvaluator(new UserPermissionEvaluator());
        return handler;
    }

第三

我们需要写一个类实现PermissionEvaluator接口,并且实现hasPermission方法
直接上代码

package com.sans.security;

import com.sans.core.entity.SysMenuEntity;
import com.sans.core.service.SysUserService;
import com.sans.security.entity.SelfUserEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


@Component
public class UserPermissionEvaluator implements PermissionEvaluator {

    Logger logger=LoggerFactory.getLogger(UserPermissionEvaluator.class);

    @Autowired
    private SysUserService sysUserService;
    /**
     * hasPermission鉴权方法
     * 这里仅仅判断PreAuthorize注解中的权限表达式
     * 实际中可以根据业务需求设计数据库通过targetUrl和permission做更复杂鉴权
     * 当然targetUrl不一定是URL可以是数据Id还可以是管理员标识等,这里根据需求自行设计
     * @Author Sans
     * @CreateTime 2019/10/6 18:25
     * @Param  authentication  用户身份(在使用hasPermission表达式时Authentication参数默认会自动带上)
     * @Param  targetUrl  请求路径
     * @Param  permission 请求路径权限
     * @Return boolean 是否通过
     */
    @Override
    public boolean hasPermission(Authentication authentication, Object targetUrl, Object permission) {

        logger.info("进来了!!!");
        logger.info("permission:{}",permission);

        // 获取用户信息
        SelfUserEntity selfUserEntity =(SelfUserEntity) authentication.getPrincipal();
        // 查询用户权限(这里可以将权限放入缓存中提升效率)
        Set<String> permissions = new HashSet<>();
        List<SysMenuEntity> sysMenuEntityList = sysUserService.selectSysMenuByUserId(selfUserEntity.getUserId());
        for (SysMenuEntity sysMenuEntity:sysMenuEntityList) {
            permissions.add(sysMenuEntity.getPermission());
        }
        // 权限对比
        if (permissions.contains(permission.toString())){
            return true;
        }
        return false;
    }
    @Override
    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
        return false;
    }
}

在这里我们就可以使用页面的标签及其方法上的注解
直接上代码

<div sec:authorize="hasPermission('/product/list','product:list')">
    <a href="/product/list">商品查询</a><br/>
</div>


@PreAuthorize("hasPermission('/product/list','product:list')")
    @RequestMapping(value = "/list")
    public String list() {
        return "product/list";
    }

这里有两个参数,我们说明一下什么意思。
第一个 资源URL(即请求路径)
第二个 对应的权限

以后会为大家介绍 没有赋予权限该如何处理
当然没有赋予权限的话,页面会出现

在这里插入图片描述

Forbidden 禁止的意思 403指未授权
控制台也不会报错,其实这个问题是否解决,个人感觉无所谓。只要不让用户做到非法请求的目的就行。。。

这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上。。。

欢迎加入技术群聊
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 JSP 页面中,可以使用 EL 表达式调用 Java 类中的方法。因此,你可以在 Java 类中定义一个方法来判断当前用户是否有权限访问某个按钮,然后在 JSP 页面中使用 EL 表达式调用该方法。 具体步骤如下: 1. 在 Java 类中定义一个方法,该方法接受一个字符串参数,表示要判断权限的按钮名称,返回一个布尔值,表示当前用户是否有权限访问该按钮。例如: ``` public class ButtonAccessUtils { public static boolean hasAccess(String buttonName) { // 在这里编写自定义的判断逻辑,判断当前用户是否有权限访问该按钮 // 如果有权限,返回 true,否则返回 false } } ``` 2. 在 JSP 页面中使用 EL 表达式调用该方法。例如: ``` <security:authorize access="${@ButtonAccessUtils@hasAccess('button1')}"> <!-- 只有当前用户有权限访问 button1 按钮时,才会显示下面的内容 --> <button>button1</button> </security:authorize> <security:authorize access="${@ButtonAccessUtils@hasAccess('button2')}"> <!-- 只有当前用户有权限访问 button2 按钮时,才会显示下面的内容 --> <button>button2</button> </security:authorize> ``` 在上面的例子中,我们使用 ${@ButtonAccessUtils@hasAccess('button1')} 表达式来调用 ButtonAccessUtils 类中的 hasAccess 方法,并传递了一个字符串参数 'button1'。如果该方法返回 true,则表示当前用户有权限访问 button1 按钮,此时会显示一个名为 button1 的按钮;否则,不会显示该按钮。同理,我们使用 ${@ButtonAccessUtils@hasAccess('button2')} 表达式来判断当前用户是否有权限访问 button2 按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值