Shiro拦截器给方法授权,赋访问权限

本文介绍如何使用Shiro框架实现基于角色的权限管理。通过配置ShiroConfig类重写授权方法,从数据库查询用户权限,并利用@RequiresPermissions注解限制访问权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ShiroConfig配置类重写授权方法:


    //授权方法
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
        //从session中获取到当前登录的用户对象
        //Object principal = SecurityUtils.getSubject().getPrincipal();
        UserBean primaryPrincipal = (UserBean) principal.getPrimaryPrincipal();
        //后台数据库查询是否由此字段并返回权限字
        List<String> powerList = userService.queryPowerKeyByUserId(primaryPrincipal.getId());  
        //List<String> objects = new ArrayList<>();
        //赋权限
        //objects.add("user:findUserList");
        //创建一个授权器
        SimpleAuthorizationInfo sai = new SimpleAuthorizationInfo();
        sai.addStringPermissions(powerList);
        return sai;
    }

Mapper层根据sql查询出权限字:

    @Select("select distinct pm.remark from t_user_role ur,t_role_power rp,t_power_menu pm         where ur.roleid = rp.roleid\n" +
            "            and rp.powerid = pm.powerId\n" +
            "            and ur.userid = #{value}")
    List<String> queryPowerKeyByUserId(Integer  id);

给你的方法加一个注解@RequiresPermissions("user:findUserList")(权限字)

    // 分页用户查询
    @RequiresPermissions("user:findUserList")
    @RequestMapping("findUserList")
    @ResponseBody
    public EasyuiPage findUserList(Integer page, Integer rows, UserBean userBean) {
        return userService.findUser(page, rows, userBean);
    }

如果你从后台查出的权限字和@RequiresPermissions中的权限字一致,则必须给用户赋权限才可以访问,否则无法访问。

MySql remark字段:

Apache Shiro拦截器机制是其安全框架中的核心功能之一,用于控制对 Web 应用程序中资源的访问拦截器可以通过配置来实现不同的权限控制策略,包括认证、授权、拒绝访问等。 在 Shiro 中,拦截器的配置主要通过 `shiro.ini` 文件或 Java 配置类完成。以下是一个基于 `shiro.ini` 的典型配置示例: ```ini [main] # 定义一个拦截器,并设置属性 hostFilter = org.apache.shiro.web.filter.authz.HostFilter hostFilter.authorizedIps = 192.168.1.0/24 hostFilter.deniedIps = 10.0.0.1 [urls] # 使用定义的拦截器保护特定 URL /admin/** = hostFilter /login = authc /logout = logout /static/** = anon ``` 上述配置中,`hostFilter` 被用来限制 `/admin/**` 路径下的所有请求只能从指定的 IP 地址范围访问。`authorizedIps` 指定了允许访问的 IP 地址段,而 `deniedIps` 则指定了明确拒绝访问的 IP 地址 [^1]。 对于更复杂的场景,可以利用 Shiro 提供的一系列默认拦截器,例如: - `authc`:需要用户登录后才能访问。 - `anon`:匿名访问,不需要登录。 - `roles[role1, role2]`:要求用户具有指定的角色。 - `perms[file:read, file:write]`:要求用户拥有特定的权限 [^3]。 当使用 Spring Boot 整合 Shiro 时,可以通过创建自定义的 `ShiroConfig` 类来进行更加灵活的配置。下面是一个简单的 Java 配置示例: ```java @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); // 设置登录的URL shiroFilterFactoryBean.setLoginUrl("/login"); // 设置未授权页面 shiroFilterFactoryBean.setUnauthorizedUrl("/error"); // 配置访问规则 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/admin/**", "roles[admin]"); filterChainDefinitionMap.put("/user/**", "authc"); filterChainDefinitionMap.put("/**", "anon"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } // 其他必要的 bean 配置... } ``` 此代码片段展示了如何在 Spring Boot 应用中配置 Shiro 拦截器。首先设置了安全管理器,然后定义了登录和未授权页面的 URL,最后通过 `filterChainDefinitionMap` 来指定不同路径下的访问规则 [^4]。 通过这些配置方法,开发者可以根据实际需求灵活地应用 Shiro拦截器机制以达到预期的安全控制效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听风动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值