2 dmaker DMaker 于 2016.02.23 14:50 提问

shiro 与spring mvc整合,自定义过滤器的问题,求解,看详细内容

这是roleFilter:

 public class RolesOrAuthorizationFilter 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);
        // 自定义部分
        for (String role : roles) {
            if(subject.hasRole(role)){
                return true;
            }
        }

        return false;
    }

}

这是动态取出url:

public class ChainDefinitionSectionMetaSource implements
        FactoryBean<Ini.Section> {

    @Autowired
    private Sys_RoleService roleService;
    @Autowired
    private Sys_RoleRighService roleRightService;
    @Autowired
    private Sys_RightService rightService;
    @Autowired
    private Sys_RightResourceService rightResourcesService;
    @Autowired
    private Sys_ResourceService resourcesService;

    private String filterChainDefinitions;

    /**
     * 默认permission的字符串
     */
    public Section getObject() throws Exception {

        // 查找出所有的资源
        List<Sys_resource> resources = resourcesService.findAll();

        // 加载默认的url
        Ini ini = new Ini();
        ini.load(filterChainDefinitions);
        Ini.Section section = ini.getSection(ini.DEFAULT_SECTION_NAME);

        if (resources != null && resources.size() > 0) {
            for (Sys_resource resource : resources) {
                String url = resource.getUrl();
                List<String> rightIds = resourcesService
                        .findRightStrByResourceId(resource.getId());
                if (rightIds != null && rightIds.size() > 0) {
                    for (String rightId : rightIds) {
                        List<String> roleIds = roleRightService
                                .findRoleIdByRightId(rightId);
                        if (roleIds != null && roleIds.size() > 0) {
                            String roles = "";
                            for (String roleId : roleIds) {
                                String roleName = roleService.findById(roleId)
                                        .getRname();
                                roles += "," + roleName;
                            }
                            // 分隔
                            roles = roles.substring(1);
                            // 添加到section中
                            section.put(url, "rolesOr[\"" + roles + "\"]");
                        }
                    }
                }
            }
        }

        System.out.println("权限:" + section.values());

        return section;
    }

    public Class<?> getObjectType() {
        return this.getClass();
    }

    public boolean isSingleton() {
        return false;
    }

    public void setFilterChainDefinitions(String filterChainDefinitions) {
        this.filterChainDefinitions = filterChainDefinitions;
    }

}

配置文件:

     <bean id="chainDefinitionSectionMetaSource" class="com.hxzSaas.shiro.ChainDefinitionSectionMetaSource">
            <property name="filterChainDefinitions">
                <value>
                    <!-- 只有登陆之后才可以访问 -->
                    /index.jsp = anon
                    /index.do = anon
                    /resources/** = anon
                    /templates/** = anon
                    /logout.do = logout
                    /user/UserManager/list.do = rolesOr["admin,超级管理员"]
                    /** = authc
                </value>
            </property>
         </bean>

        <!-- 配置在web.xml 中配置的bean的名称 -->
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <property name="securityManager" ref="securityManager" />
            <property name="loginUrl" value="/login.do" />
            <property name="unauthorizedUrl" value="/common/noright.do" />
            <property name="filters">
                <map>
                    <entry key="rolesOr" >
                        <bean class="com.hxzSaas.shiro.RolesOrAuthorizationFilter" />
                    </entry>
                </map>
            </property>
            <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />

在配置文件中写url的时候,自定义roleOr过滤器可以使用,比如:/user/UserManager/list.do = rolesOr["管理员"] ,这样配置的角色是管用的,但是,当从数据库中的取出的时候,就会不经过自定义的过滤器,这是什么原因呢??求大神解答,小弟初学者,搞了一个上午,是在无法解决,多谢了

1个回答

rui888
rui888   Ds   Rxr 2016.02.23 16:49

当从数据库中的取出的时候 经过reqeust 请求了吗?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
springboot整合shiro和自定义过滤器
filter自定义过滤器  增加了 对验证码的校验 package com.youxiong.filter; import com.youxiong.shiro.UsernamePasswordKaptchaToken; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.subject.Su
springboot集成Shiro,添加自定义filter后shiro的默认filter无法使用
在springboot中集成shiro,发现再添加了自定义的filter后默认的filter无法使用。 猜测是自定义的filter被放在了默认的filter前面,导致先被自定义的filter拦截了。 网上搜了一遍,只发现了一篇相关的文章:http://www.hillfly.com/2017/179.html 证实了的确是我所猜想的那般,自定义的filter被放在了shiro
spring boot配置shiro自定义shiro filter匹配异常
原文地址:http://www.hillfly.com/2017/179.html最近忙着研究在 Springboot 上使用 Shiro 的问题。刚好就遇到个诡异事,百度 Google 也没找到啥有价值的信息,几番周折自己解决了,这里稍微记录下。自定义 FilterTOCShiro 支持自定义 Filter 大家都知道,也经常用,这里我也用到了一个自定义 Filter,主要用于验证接口调用的 A...
Shiro系列之Shiro+Spring MVC整合(Integration)
Shiro系列之Shiro+Spring MVC整合第一步,Shiro Filter在web.xml文件中增加以下代码,确保Web项目中需要权限管理的URL都可以被Shiro拦截过滤。 shiroFilter org.springframework.web.filter.DelegatingFilterProxy
Springboot 集成Shiro自定义Filter
网上自定义Filter的实现很多,这里我提供一种Springboot在代码中的实现。Shiro提供的Filter我这里不一一介绍了,一般基于web会话的都是使用authc(这是FormAuthenticationFilter)。根据我无状态的登陆需求,选择了AccessControlFilter,网上也有说这个是最被广泛使用的,具体还是看自己需求吧。Filter代码:/** * @author C
转载:Spring Boot (十四):springboot整合shiro-登录认证和权限管理
这篇文章我们来学习如何使用Spring Boot集成Apache Shiro。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在Java领域一般有Spring Security、Apache Shiro等安全框架,但是由于Spring Security过于庞大和复杂,大多数公司会选择Apache Shiro来使用,这篇文章会先介绍一下Apache Shiro,在结合Spri
shiro-入门,快速与springmvc整合,全注解,最简单让项目运行起来
笔记:springboot、springmvc全注解入门整合shiro功能介绍该示例:大概功能如下: 由于角色可以自由创建,拥有权限分配的功能的帐号,可以把自身的权限分配给创建的角色。所以本人只想到了,使用请求地址来控制每一个权限。 整合开始:1.添加shiroFilter过滤器在能替代web.xml的配置类中添加过滤器package web.config;import java
SpringMVC整合Shiro
完整版见https://jadyer.github.io/2013/09/30/springmvc-shiro/
Spring Boot Shiro权限管理--自定义 FormAuthenticationFilter验证码整合
验证码 思路 shiro使用FormAuthenticationFilter进行表单认证,验证校验的功能应该加在FormAuthenticationFilter中,在认证之前进行验证码校验。 需要写FormAuthenticationFilter的子类,继承FormAuthenticationFilter,改写它的认证方法,在认证之前进行验证码校验。 自定义FormAuthen
关于shiro+springMVC整合使用的问题
最近做新系统的时候,关于权限刚开始考虑用spring security,研究了两天发现好复杂,就换了shiro,又折腾了几天,总算调试通过了,但是这过程也到处是坑,这里做个记录,如果有同样需求的,以防再掉进去。 从网上搜shiro教程的时候,大部分都是基于配置文件或者是角色进行管理的,但是我们平时做web系统根本不会这么用的,我们都是基于权限permissions的管理方式,这里推荐一个比价