复习步骤9-获取权限数据CustomRealm提供subject桥梁,集成spring -shiro XML配置文件权限--自定义和非自定义授权过滤器

项目目录结构

       非自定义授权过滤器   

         spring.xml

/testrole1=roles["admin"] <!-- 要有admin 角色才可以访问 /testrole url-->

                /testrole2=roles["admin","sjr"] <!-- 要有admin sjr 角色才可以访问 /testrole2 url 未测-->

                /testPerms1=perms["user:select"] <!-- 要有user:select 权限 才可以访问 /testPerms1 url-->

                /testPerms2=perms["user:select","user:update","user:add"] <!-- 要同时有user:select,user:update,user:add 权限 才可以访问 /testPerms2 url-->

 

            UserController.java中加

//produces = "application/json; charset=utf-8" 解决@ResponseBody 返回中文乱码

    

     /*配置文件方式 配置授权--非自定义授权过滤器  测试账号,一般为 刘少峰 123456 登录(数据存的密码事 123456 yan 加密的) */

          // 配置文件方式 配置授权--非自定义授权过滤器   spring.xml shiro  /testrole1=roles["admin"] --要有admin 角色才可以访问 /testrole1 url,登录之后有admin角色 请求 /testrole1 就可以进来了

     @RequestMapping(value="/testrole1",method=RequestMethod.GET,

            produces = "application/json; charset=utf-8")

     @ResponseBody

     public String testrole1(){

        return "admin角色,登录成功";

     }

        // 配置文件方式 配置授权--非自定义授权过滤器   spring.xml shiro /testPerms1=perms["user:select"]  --要有user:select 权限 才可以访问 /testPerms1 url,登录之后有user:select角色 请求 /testrole1 就可以进来了

     @RequestMapping(value="/testPerms1",method=RequestMethod.GET,

            produces = "application/json; charset=utf-8")

     @ResponseBody

     public String testPerms1(){

        return "user:select 权限,登录成功";

     }

    

    

         // 配置文件方式 配置授权--非自定义授权过滤器   spring.xml shiro /testPerms2=perms["user:select","user:update","user:add"]   --要同时具有user:selectuser:updateuser:add 权限 才可以访问 /testPerms2 url,登录之后 请求 /testrole2 就可以进来了

     @RequestMapping(value="/testPerms2",method=RequestMethod.GET,

            produces = "application/json; charset=utf-8")

     @ResponseBody

     public String testPerms2(){

        return "user:selectuser:updateuser:add 权限,登录成功";

     }

    

  先用 刘少峰 123456 登录

然后再 /testPerms1 /testPerms2/testrole1 测试

 

 

 

 

          //自 定义角色权限 过滤器

     自定义角色权限过滤器类

RolesOrFilter.java

 

    package com.xiangshuai.filter;

 

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

 

import org.apache.shiro.subject.Subject;

import org.apache.shiro.web.filter.authz.AuthorizationFilter;

 

/**

 * maven 项目- 文件位置:E:\学习文档子目录压缩\框架\shiro\shiro安全框架入门\复习步骤9-获取权限数据CustomRealm提供subject桥梁,集成spring -shiro  XML配置文件权限--自定义和非自定义授权过滤器

 * 我的网盘/我的笔记/学习文档子目录压缩\框架\shiro\shiro安全框架入门\复习步骤9-获取权限数据CustomRealm提供subject桥梁,集成spring -shiro  XML配置文件权限--自定义和非自定义授权过滤器

 * 自定义filter做权限检查  rolesOR 拦截,只要 含有其中任意一个roles角色,就可以访问

 * @author lqx

 *AuthorizationFilter这个抽象类也是继承自AccessControlFilter,(其他过滤器百度),他是用于处理登陆后的权限检查

 */

public class RolesOrFilter extends AuthorizationFilter{

 

    @Override

    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)

           throws Exception {

       Subject subject = getSubject(request, response);//filter的父类 提供了用getSubject获得主体的方法

       String[] roles=(String[]) mappedValue;//这个参数就是由 拦截器定义的 比如浏览器请求 testRoleOr1 时在 shirospring.xml中定义的rolesOR["sjr","admin"] ,那么这个mappedValue 就是["sjr","admin"]

       if(roles==null || roles.length==0){//不需要权限

           return true;

       }

       for (String role : roles) {

           if(subject.hasRole(role)){//如果subject 含有访问目标资源的权限,那么chain拦截器链就放行

              return true;

           }

       }

 

       return false;

    }

 

}

 

 

 

 

    spring.xml

<!-- 定义RolesOrFilter,让spring IOC -->

      <bean class="com.xiangshuai.filter.RolesOrFilter" id="rolesOrFilter"/>

 

       

         

 

 

   UserController.java中加

// 配置文件方式 配置授权--自定义授权过滤器  自定义  rolesOR 拦截,用户登录之后 只要 含有其中任意一个roles角色,就可以访问 spring.xml shiro /testRoleOr1=rolesOR["sjr","admin"]  /testRoleOr2=rolesOR["hehehe","test1"]-

     @RequestMapping(value="/testRoleOr1",method=RequestMethod.GET,

            produces = "application/json; charset=utf-8")

     @ResponseBody

     public String testRoleOr1(){//刘少峰 123456 含有 admin权限,所以可以访问此资源--/testRoleOr1=rolesOR["sjr","admin"]

        return "没有sjy有权限,但有admin权限,登录成功";

     }

    

     @RequestMapping(value="/testRoleOr2",method=RequestMethod.GET,

            produces = "application/json; charset=utf-8")

     @ResponseBody

     public String testRoleOr2(){//刘少峰 123456 不含有 hehehe权限,也不含有test1,所以不可以访问此资源-/testRoleOr2=rolesOR["hehehe","test1"]

        return "既没有heheh 权限,也没有哦test1权限,";

     }

 

 

     页面请求

 

 

 

 

    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中使用Shiro进行自定义过滤器配置,可以按照以下步骤进行操作: 1. 在pom.xml文件中添加Shiro的依赖: ``` <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> ``` 2. 创建自定义过滤器类UserAuthenticatingFilter和UserAuthenticatingOrJwtTokenFilter,继承自Shiro提供的AuthenticatingFilter类。 UserAuthenticatingFilter类用于实现基于表单认证的过滤器,该过滤器可以在用户访问需要身份认证的资源时进行身份认证,并将用户的登录信息保存到ShiroSubject对象中。 UserAuthenticatingOrJwtTokenFilter类用于实现基于JWT令牌认证的过滤器,该过滤器可以在用户访问需要身份认证的资源时进行身份认证,如果请求头中携带了有效的JWT令牌,则使用JWT令牌进行身份认证,否则使用基于表单的身份认证方式。 3. 在Shiro配置类中进行过滤器配置: ``` @Configuration public class ShiroConfig { // ... @Bean public UserAuthenticatingFilter userAuthenticatingFilter() { return new UserAuthenticatingFilter(); } @Bean public UserAuthenticatingOrJwtTokenFilter userAuthenticatingOrJwtTokenFilter() { return new UserAuthenticatingOrJwtTokenFilter(); } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, UserAuthenticatingFilter userAuthenticatingFilter, UserAuthenticatingOrJwtTokenFilter userAuthenticatingOrJwtTokenFilter) { // 创建ShiroFilterFactoryBean对象 ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); // 设置SecurityManager factoryBean.setSecurityManager(securityManager); // 设置自定义过滤器 Map<String, Filter> filters = new HashMap<>(); filters.put("userAuthenticatingFilter", userAuthenticatingFilter); filters.put("userAuthenticatingOrJwtTokenFilter", userAuthenticatingOrJwtTokenFilter); factoryBean.setFilters(filters); // 设置过滤器链 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**", "userAuthenticatingOrJwtTokenFilter"); factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return factoryBean; } // ... } ``` 在上述代码中,我们通过@Bean注解创建了两个自定义过滤器实例:UserAuthenticatingFilter和UserAuthenticatingOrJwtTokenFilter,然后将这两个过滤器添加到ShiroFilterFactoryBean对象中,并设置过滤器链。 4. 在Controller中使用Shiro进行身份认证: ``` @RestController public class UserController { @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(String username, String password) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { subject.login(token); return "login success"; } catch (AuthenticationException e) { return "login failed"; } } @RequestMapping(value = "/logout") public String logout() { Subject subject = SecurityUtils.getSubject(); subject.logout(); return "logout success"; } @RequestMapping(value = "/test") public String test() { return "test success"; } } ``` 在上述代码中,我们通过调用SecurityUtils.getSubject()获取当前Subject对象,然后使用UsernamePasswordToken进行身份认证。如果身份认证成功,则返回"login success"字符串;否则返回"login failed"字符串。 5. 在Postman或浏览器中访问API: - 访问/login接口进行身份认证,例如: ``` POST http://localhost:8080/login?username=admin&password=admin ``` - 访问/test接口进行访问控制,例如: ``` GET http://localhost:8080/test ``` 如果用户已经登录,则返回"test success"字符串;否则返回"401 Unauthorized"错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值