`

Shiro Security

 
阅读更多

一直在用springside的开源项目做项目基础架构,从springside4开始权限管理框架由SpringSecurity更换为shiro,由于以前一直用spring的权限管理框架所以这次也把shiro和SpringSecurity进行了简单对比,有时间的话我会将搭建一套maven+springboot+spring-data-jpa+hibernate/mybatis+shiro+bootstrap的通用权限管理框架,作为maven模版,以后分享给大家。

具体整理如下:

1.权限模型

除了够简单,Shiro与SpringSecurity的不同在于支持权限判断与角色判断两套API,代码里既可以简单的判断hasRole("administrator"),也可以更准确的判断hasPermission("Order:Approve")。

实际上,大部分的应用都采用后者,角色只用来组织管理一堆权限的集合,而不会在最终代码(JSP, URL Filter, Java Code)里用作直接的权限判断。

而SpringSecurity和JAAS却都只支持基于角色判断的API,所以在以前的代码里都会别扭的把Role当Permission来使用("ROLE_User:Approve")。

2.用户权限构造

另一个不同的地方是, SpringSecurity用户的权限在login时就构造好并保存在session中。如果中途改变用户或角色的权限,只能想办法把他踢走重登录才能生效。 而Shiro会在每次检验权限时才查询权限。当然,为了性能考虑,Shiro提供了起码两种权限缓存方案,详见后面的Caching小节。

3.权限控制

权限控制分为页面内容,URL,和Java代码三层。 老规矩是页面内容用taglib,URL的控制在applicationContext.xml里配置,java代码用Annotation。

页面内容的控制保证了善良的用户不会点击自己无权限的功能。而对于恶意用户,在URL还是Java层(又分Controller或Service两层)进行校验可按实际需求而定。

在quickstart中,因为所有JSP都已经在WEB-INF/下保护起来,不可能被直接访问,所有的页面访问都要经过Controller,所以使用Annotation进行恶意用户保护达到的效果更好,URL级别只做用户是否登录的限制。

Step by Step

Step1. 创建一个login.jsp

默认的input框名字应该是userName,password和rememberMe。

如果登录出现异常,它会放一个叫"shiroLoginFailure"的requestAttribute, 内容则是Exception的类名, showcase中的login.jsp演示了对不同的异常显示不同的出错信息。

注意实际的login和logout操作都是由配置在applicationContext.xml中的shiroFilter来完成的,所以即使是在SpringMVC里写一个打酱油的Controller,它也只应该负责显示初始的login.jsp和登录如果失败再次显示login.jsp。

Step2. 实现一个AuthorizingRealm

查找用户AuthenticationInfo的函数,包括用户名、密码及Salt。 查找权限的函数,Role与Permission均可,仅在CacheManager缓存不存在时被调用。 一般密码不是明文存储的,需要在构造函数里指明密码匹配器,比如现在比较流行的,使用salt的,1024次 sha-1 hash 如果想在页面显示当前用户的更多信息,可以构造一个特定的用户对象,而不仅仅是用户的loginName,还可以包含id,display name等等.

Step3. web.xml里ShiroFilter统统管起来

用Shiro filter管住/,注意这里spring的DelegatingFilterProxy,需要在applcationContext-.xml里定义一个与filter-name 同名的bean

Step4. applicationContext-*.xml中的配置

最重要是ShiroFilter中filterChainDefinitions的配置,配置从上到下,以最上面的为准 详细的解释在这里: http://shiro.apache.org/web.html#Web-defaultfilters, quickstart中applicationContext-shiro.xml的配置如下:

/login = authc
/logout = logout
/static/** = anon
/** = user

authc filter 监听/login的POST请求(Get的不管)进行登录认证。如果成功就跳回前一个页面 或者上面配的successfulUrl,如果失败就forward到login page,不过这时候就是POST的,那个打酱油的LoginController要注意。

logout filter 负责监听/logout,所以把"退出登录"的链接设为/logout即可

/static/** 这些静态图片都不需要监控,轻轻放过,然后后面几个link就需要permission控制了。

/** = user 最后保证除上述url外的所有url都必须是已登录的,未登录的用户访问会跳转到登录页面。

另外RememberMe默认由cookie实现,有效时间一年,如果需要改变,配置新的RememberMeManager并注入SecurityManager.

注意URL Pattern里用到的是两颗星,才能实现任意层次的全匹配

其他可选的设置

/admin/** = roles[admin]
/rest/users = authcBasic

Step5. JSP内容控制

http://shiro.apache.org/web.html#Web-taglibrary, 提供了那些必然有的标签,如表示只有未登录才显示(显示请登录),表示只有登录了才显示(显示请退出),检查权限等等.

比较有趣是显示当前用户的标签,你可以在reaml登录时自定义一个用户对象(见step2),然后用显示下面的标签想显示的属性。

<principal property="firstName"/> 

Shiro默认没有提供hasAnyPermissions的tag,因此Springside-core中另外提供了一个增强的版本,jsp中定义taglib时,url改为http://www.springside.org.cn/tags/shiro 即可

Step6. 方法级控制

在applicationContext.xml(Service层)或spring-mvc.xml中加入AOP定义,见quickstart的spring-mvc.xml

在方法上加入

    @RequiresPermissions("User:Edit")

如果要实现多个Role之间Or的关系,可以写成这样:

    @RequiresRoles(value = { "Admin", "User" }, logical = Logical.OR)

如果要在controller上用annotation控制权限,spring-mvc.xml需要如下配置:

1.因为applicationContext-shiro.xml中的AOP管不到controller,因此需要在spring-mvc.xml中加入相同配置

2.添加统一的异常处理,用SimpleMappingExceptionResolver映射UnauthorizedException到eror/403.jsp, 因为出现此错误的用户基本都是恶意用户,因此403.jsp简单显示错误即可。

Tips

1. 各种Bean找不到的问题。

A. 与Spring Data JPA同时使用时,ShiroFilterFacotryBean的BeanPostProcessor报找不到XXDao类,可能是Spring Data JPA的BeanPostProcessor还没完成自己的任务吧。一个workaround方法是在shiroDbRealm的定义里加上depends-on="缺失Dao"的定义,强制Dao被初始化。 B. 用AOP控制方法时,把DefaultAdvisorAutoProxyCreator的proxyTargetClass属性设为true,与事务AOP一起使用cglib。

2. Cache

如前所述,Shiro会在每次鉴权时重新获取用户的授权信息,一般需要用Cache缓存起来。

默认的Cache是JVM内的,不会过期,这就需要在用户和角色管理中,显式的插入代码在修改用户/角色后清理缓存。如果懒一点,可以使用Ehcache单机版,定义120秒自然过期。另外,如果是集群,又希望即时更新,就又需要使用Ehcache 集群方案如Ehcache-RMI,又要插入代码即时更新。 但个人还是推荐使用120秒自然过期最为简单方便,见showcase中的示例。

   
 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="shiroDbRealm" />
        <property name="cacheManager" ref="shiroEhcacheManager" />
    </bean>
    <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:security/ehcache-shiro.xml"/>
    </bean>
分享到:
评论

相关推荐

    GrailsAngularWithShiro:Grails 中与 Shiro Security 的 Angular 集成

    《GrailsAngularWithShiro: Grails与Shiro Security在Angular中的集成实践》 在现代Web开发中,安全性和可扩展性是至关重要的考虑因素。本文将深入探讨如何在Grails框架中集成Apache Shiro安全库,同时利用...

    Shiro+Spring Security学习文档

    在IT安全领域,Apache Shiro和Spring Security是两个非常重要的框架,它们主要用于应用程序的安全管理,包括身份验证、授权、会话管理和加密等。本学习文档集合了这两个框架的相关知识,旨在帮助开发者深入理解和...

    shiro 安全框架 最好的中文配置文档

    相比于 Spring Security,Shiro 提供了更加简洁直观的 API 接口,能够很好地与多种应用环境进行集成,包括 Web 应用、Java 应用以及移动应用等。Shiro 的核心特性之一是它的 Native Session 机制,这种机制使得 ...

    erp管理系统

    权限系统搭建 shiro security 3个能力 1. 前后端调试 2. 学会分析需求转成java代码 -&gt; 需求-&gt; 表(字段,???) dao -&gt; service -&gt; web -&gt; 展示 3. 知道erp的主线业务 ERP 企业资源计划 资源: 有形: 风扇、...

    Spring Security和Shiro的相同点与不同点整理

    Spring Security和Apache Shiro都是Java领域中广泛使用的安全框架,它们为应用程序提供了强大的身份验证、授权和会话管理功能。虽然两者在很多方面有相似之处,但也有各自的特点和适用场景。 **相同点:** 1. **...

    springsecurity,shiro

    Spring Security和Apache Shiro都是Java领域内的主流安全框架,它们提供了一整套解决方案来保护应用程序免受未经授权的访问和攻击。让我们详细探讨这两个框架的核心概念、功能以及它们如何帮助开发者实现安全性。 ...

    SpringBoot、SpringBoot&Shiro;、SpringCloud、SpringSecurity&SpringSecurityOAuth2;

    循序渐进,学习Spring Boot、Spring Boot & Shiro、Spring Cloud、Spring Security & Spring Security OAuth2,博客Spring系列源码

    SpringSecurity与shiro的使用

    Spring Security与Shiro的使用 Spring Security和Shiro都是流行的Java安全框架,用于保护Web应用程序免受未经授权的访问。下面我们将分别介绍Spring Security和Shiro的使用。 Shiro框架 Shiro是一个轻量级的安全...

    Shiro入门到精通

    本课程“Shiro入门到精通”旨在帮助开发者全面理解和掌握Shiro的使用,通过与Spring Security的对比,进一步突出Shiro在实际开发中的优势和适用场景。 首先,我们来探讨Shiro的基础知识。Shiro的核心组件包括...

    shiro 1.4.1.rar

    目前,使用 Apache Shiro 的人越来越多,因为它相当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大. Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 ...

    shiro学习文档

    Apache Shiro Java Security Framework.mht,shiro,shiro,shiro,shiro

    springboot整和jwt、shiro、redis实现token自动刷新

    在Spring Boot项目中实现这一流程,首先需要引入相关的依赖,如Spring Security、Shiro、JWT库以及Redis相关库。然后配置Shiro的WebFilter,确保请求被Shiro拦截并执行认证。接着,我们需要创建一个JWTToken Realm,...

    Application Security With Apache Shiro

    Apache Shiro是一个强大的、易于使用的Java安全框架,它主要提供了认证、授权、加密、会话管理四大核心功能,用以确保应用程序的安全性。Shiro不仅适用于命令行应用程序、移动应用程序,而且适用于大型的Web和企业级...

    springboot shiro pac4j cas jwt认证中心sso完整项目

    本项目基于SpringBoot框架,结合Shiro、pac4j和CAS,构建了一个完整的JWT认证中心,旨在实现高效、安全的SSO解决方案。 1. **SpringBoot**: SpringBoot是Spring框架的一个扩展,它简化了Spring应用的初始搭建以及...

    shiro权限管理系统示例

    4. **Spring Security比较**:虽然Shiro和Spring Security都是Java安全框架,但它们各有特点。Shiro更轻量级,易于理解和使用,适合小型项目;Spring Security则功能更全面,适合大型复杂系统。示例可能对比了两者在...

    shiro权限框架文档

    Shiro文档通常还会介绍如何通过Shiro的POJO API来进行安全操作,以及如何与Spring Security集成,提供与Spring框架更好的整合性。文档中还可能会介绍Shiro的Grails插件,这是一个专门为Grails框架准备的插件,允许...

    shiro核心资料笔记

    2. **创建Web Security Manager**:配置适用于Web 应用的SecurityManager,并注入到Servlet 容器中。 3. **Web 控制器与Shiro 集成**:在控制器方法上使用Shiro 注解进行权限控制,如`@RequiresPermissions` 和 `@...

    spring boot shiro demo项目

    相比Spring Security,Shiro通常被认为更易于理解和使用,更适合小型到中型项目的权限管理。 Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权(权限)、加密和会话管理功能,可以非常轻松地开发出...

    Shiro与SSM整合(内含详细文档介绍)

    Apache Shiro 和 Spring Security (SSM) 是两个广泛使用的Java安全框架,它们分别提供认证、授权、会话管理和加密等功能,以确保Web应用程序的安全性。本资料包将深入讲解如何将Shiro与SSM整合,以实现更高效、灵活...

    springboot+shiro+redis整合

    在IT行业中,SpringBoot、Shiro和Redis是三个非常重要的技术组件,它们分别在不同的领域发挥...在实际应用中,还可以根据需要扩展Shiro的功能,比如添加自定义的拦截器,或者结合Spring Security进行更深度的安全控制。

Global site tag (gtag.js) - Google Analytics