`

Shiro动态创建filterchaindefinitions

 
阅读更多
shiro+redis+springMvc整合配置及说明http://blog.csdn.net/siqilou/article/details/44194165
, 有很详细的例子



原文http://javawolf-1.iteye.com/blog/1913884
有时,在某些系统想通过读取数据库来定义org.apache.shiro.spring.web.ShiroFilterFactoryBean的filterChainDefinitions。这样能够通过操作界面或者维护后台来管理系统的链接。
在shrio与spring集成好了以后,调试源码的高人可能已经注意到。项目启动时,shrio通过自己的org.apache.shiro.spring.web.ShiroFilterFactoryBean类的filterChainDefinitions(授权规则定义)属性转换为一个filterChainDefinitionMap,转换完成后交给ShiroFilterFactoryBean保管。ShiroFilterFactoryBean根据授权(AuthorizationInfo类)后的信息去判断哪些链接能访问哪些链接不能访问。filterChainDefinitionMap里面的键就是链接URL,值就是存在什么条件才能访问该链接,如perms、roles。filterChainDefinitionMap是一个Map,shiro扩展出一个Map的子类Ini.Section
现在有一张表的描述实体类,以及数据访问:
@Entity
@Table(name="TB_RESOURCE")
public class Resource implements Serializable {
    //主键id
    @Id
    private String id;
    //action url
    private String value;
    //shiro permission;
    private String permission;
    //------------------Getter/Setter---------------------//
}
@Repository
public class ResourceDao extends BasicHibernateDao<Resource, String> {

}

通过该类可以知道permission字段和value就是filterChainDefinitionMap的键/值,用spring FactoryBean接口的实现getObject()返回Section给filterChainDefinitionMap即可
public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{

    @Autowired
    private ResourceDao resourceDao;

    private String filterChainDefinitions;

    /**
     * 默认premission字符串
     */
    public static final String PREMISSION_STRING="perms[\"{0}\"]";


    public Section getObject() throws BeansException {

        //获取所有Resource
        List<Resource> list = resourceDao.getAll();

        Ini ini = new Ini();
        //加载默认的url
        ini.load(filterChainDefinitions);
        Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
        //循环Resource的url,逐个添加到section中。section就是filterChainDefinitionMap,
        //里面的键就是链接URL,值就是存在什么条件才能访问该链接
        for (Iterator<Resource> it = list.iterator(); it.hasNext();) {

            Resource resource = it.next();
            //如果不为空值添加到section中
            if(StringUtils.isNotEmpty(resource.getValue()) && StringUtils.isNotEmpty(resource.getPermission())) {
                section.put(resource.getValue(),  MessageFormat.format(PREMISSION_STRING,resource.getPermission()));
            }

        }

        return section;
    }

    /**
     * 通过filterChainDefinitions对默认的url过滤定义
     * 
     * @param filterChainDefinitions 默认的url过滤定义
     */
    public void setFilterChainDefinitions(String filterChainDefinitions) {
        this.filterChainDefinitions = filterChainDefinitions;
    }



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



    public boolean isSingleton() {
        return false;
    }

}





定义好了chainDefinitionSectionMetaSource后修改applicationContext-shiro.xml文件
<bean id="chainDefinitionSectionMetaSource" class="org.exitsoft.showcase.vcsadmin.service.account.ChainDefinitionSectionMetaSource">

    <property name="filterChainDefinitions">
        <value>
            /login = authc
            /logout = logout
            /resource/** = anon
        </value>
    </property>
</bean>


<bean id="shiroSecurityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <property name="loginUrl" value="/login.jsp" />
    <property name="successUrl" value="/index.jsp" />
    <property name="unauthorizedUrl" value="/unauthorized.jsp" />
    <!-- shiro连接约束配置,在这里使用自定义的动态获取资源类 -->
    <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
分享到:
评论

相关推荐

    SpringBoot 集成 Shiro 实现动态uri权限

    SpringBoot集成Shiro实现动态URI权限是一个常见的权限管理实践,主要目的是为了实现更灵活、更安全的用户访问控制。在Web应用中,权限控制通常包括角色管理、菜单管理、操作权限(URI)管理等,而动态URI权限则允许...

    SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录

    SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 ...

    springboot+Shiro 实现动态授权

    SpringBoot结合Apache Shiro实现动态授权是一个常见的权限管理策略,旨在提供灵活且高效的访问控制。在Web应用开发中,安全框架如Spring Security和Shiro帮助我们处理用户认证和授权问题,而SpringBoot的轻量级特性...

    shiro的动态权限认证系统

    此demo使用ssm搭建而成,使用shiro进行动态的权限认证,并加入redis进行权限以及认证信息的缓存,并添加了登录错误次数的限制

    shiro+spring+hibernate+easyUI

    1,shiro+hibernate4+spring3+easyui+fusioncharts部分bootstrap样式全注解零配置简单权限管理web项目 2,简单shiro权限管控 细度到按钮 3,安装方法按config.properties参数配置你的数据库 4,运行db.sql 5,把项目导入...

    SpringBoot 整合 Shiro,实现从数据库加载权限、权限的动态更新、Session共享

    本文将深入探讨如何利用Spring Boot与Shiro进行整合,实现从数据库加载权限、权限的动态更新以及Session的共享。 首先,让我们了解Spring Boot。它是一个基于Spring框架的脚手架,为快速开发Spring应用提供了便利。...

    shiro 安全框架 最全中文配置文档.docx

    例如,你可以配置一个过滤器链来处理所有请求,或者根据URL模式动态创建过滤器链。这允许你在运行时更改安全策略,无需修改`web.xml`。 **配置示例**: ```xml &lt;bean id="securityManager" class="org.apache.shiro...

    shiro(shiro1.3.2)

    Apache Shiro是一个强大且易用的Java安全框架,主要用于处理认证、授权、加密以及会话管理等核心安全性问题。在给定的压缩包"shiro1.3.2"中,包含了Shiro的一个核心组件库"shiro-all-1.3.2.jar"以及两个日志管理库...

    shiro所有版本jar

    Apache Shiro是一个强大且易用的Java安全框架,它提供了认证、授权、加密和会话管理功能,可以非常方便地用于构建和强化应用程序的安全性。Shiro的核心目标是为开发者提供一个简单易用的安全API,使得开发者能够快速...

    shiro1.7.1.zip

    在使用Shiro 1.7.1时,开发者可以根据具体需求选择合适的模块进行集成,例如,Web应用可能会主要依赖`shiro-core`、`shiro-web`和`shiro-spring`,而需要进行复杂加密操作的应用可能需要`shiro-crypto-hash`和`shiro...

    中文版参考手册Shiro_API.rar

    1. **快速入门**:介绍如何在项目中引入Shiro,创建基本的安全配置,以及如何进行简单的认证和授权。 2. **Shiro API**:详细解释了Shiro的主要类和接口,如`Subject`、`SecurityManager`、`Realm`等,以及它们在...

    springboot集成freemarker和shiro框架

    2. 配置Shiro:创建一个名为`ShiroConfig.java`的配置类,配置Shiro Realm、过滤器链等: ```java @Configuration public class ShiroConfig { // 实现Realm,配置用户和权限 @Bean public MyRealm myRealm() { ...

    Shiro根据用户权限显示不同的菜单.Shiro根据权限显示指定菜单

    一旦用户通过认证,Shiro会创建一个Subject对象来代表当前用户。 2. **授权(Authorization)**:即权限检查,是判断用户是否有执行某个操作的权限。Shiro提供了多种方式来进行权限检查,如`hasPermission()`方法或...

    shiro_tool.zip

    学习和使用Shiro,你可以了解如何创建安全的登录系统,如何实现基于角色的权限控制,以及如何管理用户会话。此外,熟悉Shiro的事件监听和缓存机制也能帮助优化性能。在实际项目中,Shiro可以很好地与Spring Boot等...

    Apache_Shiro_使用手册(一)Shiro架构介绍

    ### Apache Shiro 使用手册(一)Shiro架构介绍 #### 一、Shiro简介 Apache Shiro 是一款功能强大且易于使用的 Java 安全框架,它提供了多种安全相关的功能和服务,包括但不限于认证、授权、加密和会话管理。相较...

    java shiro实现退出登陆清空缓存

    接下来,我们需要创建一个名为 `SystemLogoutFilter` 的类,继承 Shiro 的 `LogoutFilter`。在 `preHandle` 方法中,我们可以添加清除缓存的逻辑: ```java @Service public class SystemLogoutFilter extends ...

    vue与shiro结合实现权限按钮

    2. **自定义指令**:在Vue项目中,创建一个自定义指令(例如:`v-has-permission`),该指令接收一个权限标识符作为参数,然后在Vue实例的生命周期钩子中,通过调用Shiro的API检查当前用户是否拥有这个权限。...

    shiro.freemarker.ShiroTags已打包

    这大大降低了开发者在前端模板中实现动态权限控制的难度,使得项目更易于维护和扩展。 总的来说,`com.jagregory.shiro.freemarker.ShiroTags` 是一个增强 Freemarker 模板引擎与 Apache Shiro 集成的工具,通过...

Global site tag (gtag.js) - Google Analytics