springboot+shiro整合,自定义Shiro Filter过滤器

关于springboot和shiro的整合,可以参考博文 https://blog.csdn.net/qq_41712271/article/details/105127925

假如: /admin/order= roles["admin, root"] ,表示 /admin/order 这个接口需要用户同时具备 admin 与 root 角色 才可访问,
相当于hasAllRoles() 这个判断方法


而我们的需求: 订单信息,可以由 admin 或者  root 查看, 只要用户具备其中一个角色即可

1 编写自定义过滤器类CustomRolesOrAuthorizationFilter

import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.CollectionUtils;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.util.Set;

public class CustomRolesOrAuthorizationFilter extends AuthorizationFilter {
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        Subject subject = getSubject(request, response);

        //获取当前访问路径所需要的角色集合
        String[] rolesArray = (String[]) mappedValue;

        //没有角色限制,可以直接访问
        if (rolesArray == null || rolesArray.length == 0) {
            //no roles specified, so nothing to check - allow access.
            return true;
        }

        Set<String> roles = CollectionUtils.asSet(rolesArray);

        //当前subject是roles 中的任意一个,则有权限访问
        for(String role : roles){
            if(subject.hasRole(role)){
                return true;
            }
        }

        return false;
    }
}

2 修改 shiro的核心类ShiroConfig

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//自定义的过滤器导入这个包
import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){

        //没有权限,未授权就会调用此方法, 先验证登录-》再验证是否有权限
        shiroFilterFactoryBean.setUnauthorizedUrl("/pub/not_permit");

        //设置自定义filter------------- (改动1)
        Map<String,Filter> filterMap = new LinkedHashMap<>();
        filterMap.put("roleOrFilter",new CustomRolesOrAuthorizationFilter());
        shiroFilterFactoryBean.setFilters(filterMap);

        //拦截器路径,坑一,部分路径无法进行拦截,时有时无;因为同学使用的是hashmap, 无序的,应该改为LinkedHashMap
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();

        //-------------改动2
        filterChainDefinitionMap.put("/admin/**","roleOrFilter[admin,root]");
    }
}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要在Spring Boot中实现Shiro的跨域功能,可以遵循以下步骤: 1. 配置ShiroFilterFactoryBean:在您的Shiro配置类中,使用`ShiroFilterFactoryBean`来配置Shiro过滤器链。在这个配置中,您可以添加一个`cors`过滤器,并设置允许的跨域资源共享规则。 ```java @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { // ... // 其他配置 // ... // 添加Shiro过滤器 ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); // 设置跨域过滤器 LinkedHashMap<String, Filter> filters = new LinkedHashMap<>(); filters.put("cors", corsFilter()); // 自定义的CORS过滤器bean shiroFilterFactoryBean.setFilters(filters); // 设置过滤器链规则 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/**", "cors,authc"); // 设置跨域过滤器和其他过滤器 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } ``` 2. 自定义CORS过滤器:创建一个自定义的CORS过滤器,在该过滤器中设置允许的跨域资源共享规则。 ```java public class CorsFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 设置允许的跨域资源共享规则 response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, X-Requested-With"); filterChain.doFilter(request, response); } } ``` 3. 配置跨域过滤器Bean:将自定义的CORS过滤器配置为一个Spring Bean。 ```java @Bean public CorsFilter corsFilter() { return new CorsFilter(); } ``` 通过以上步骤,您就可以在Spring Boot中实现Shiro的跨域功能了。请根据您的具体需求进行适当的调整和配置。希望对您有帮助!如果您有任何问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值