简单的介绍,简单的配置,简单的扩展 By jfm

Slides:



Advertisements
Similar presentations
模块五 动态网页技术 任务五 查询记录 任务一 表单设计制作 任务二 简单动态的 ASP 页面制作任务三 页面与数据库的集成任务四 添加记录 任务六 电商系统融入网站.
Advertisements

Java Web 开发 授课人:张鸽. 第三讲 JSP 内置对象  JSP 有以下九种内置对象,包括:  ·request ,请求对象  ·response ,响应对象  ·pageContext ,页面上下文对象  ·session ,会话对象  ·application ,应用程序对象.
LOGO 第 9 章 Java Servlet 和 JSP 编程 孙焘. 重点: servlet 编程原理 1 servlet 的基础类与编程实现 2 JSP 编程原理 3 JSP 的常用语法 4.
第 9 章 测试部署  9.1 测试  9.2 部署. 9.1 测试  应用测试:使用 JUnit 单元测试框架 测试的目的是检验开发结果是否满足规定需求,测试是保证软件质量的一个重要手段, 在软件开发过程中是不可缺少的组成部分。 单元测试与集成测试分别有各自的定义:在实际开发中,两者之间的界定是模糊的。
Power point 制作 耿祥义 张跃平 配合 例子源代码一起使用. 第 5 章 JSP 与 JavaBean JavaBean 是一个可重复使用的软件组件, 是遵循一定标准、用 Java 语言编写的一 个类,该类的一个实例称为一个 JavaBean ,简称 bean.
动态Web开发技术--JSP.
第一章 JSP概述.
基于JSP搭建Web应用程序.
国家科学图书馆: 刘丹军、赵雅娟、王晓梅、胡正银等 创想通科技: 阎武鹏 等 2010年 洛阳
上节课我们是讲解了request, response, session, application 等内置对象,有了它们,我们就可以编写一个完整的应用程序了。 我们来看ebank这个小应用程序的编写。
中学生社会适应问题及其调适.
SAE Java 实际应用 在这里写上你的标题 作者名字/日期
基于SSH的web开发 AND 企业级WEB应用开发新技术
轻量级HTTP服务器/反向代理服务器nginx
配合< JSP程序设计>例子源代码一起使用
第8讲 HTML与PHP基础 静态网页 vs. 动态网页.
张孝祥IT课堂 -深入体验Java Web开发内幕
面向对象程序设计(Java) 徐志红
第一页是课程的标题 Spring入门示例.
MVC Servlet与MVC设计模式.
第八讲 J2EE安全机制.
攻击JAVA WEB 阿里巴巴集团安全中心 周拓.
MySQL資料庫安全管理.
J2EE Struts 和Spring 的区别.
第十章 综合编程实例 前9章分别介绍了JSP概念、运行环境、页面组成、各种技术的应用方法。本章将综合各章概念、技术和方法,把这些概念、技术和方法运用到实际应用当中,使读者对JSP技术和应用有更深刻的理解。本章涉及到4个应用:留言板、成绩管理、问卷调查和在线考试。 学习目标 理解4个应用的设计原理和设计方法.
Google App Engine Google 應用服務引擎.
集成 与 jQuery 和 Bootstrap Michael Isvy.
11-1 JDBC的基礎-說明 昇陽公司提出的資料庫中介軟體(Middleware)稱為「JDBC」(Java Database Connectivity),這是一種開放標準的Java程式介面,可以讓Java程式連接資料庫管理系統, 以Java技術來說,就是實作JDBC驅動程式介面(JDBC Driver.
Hello World 體驗實作第一個JSP程式.
第9章 过滤器和监听器技术 过滤器(Filter)和监听器(Listener)是两种特殊的Servlet技术。过滤器可以对用户的请求信息和响应信息进行过滤,常被用于权限检查和参数编码统一设置等。监听器可以用来对Web应用进行监听和控制的,增强Web应用的事件处理能力。 本章主要介绍过滤器和监听器的编程接口、基本结构、信息配置、部署和运行,最后通过案例说明过滤器和监听器的典型应用。
第四章 網頁表單與資料傳遞.
软件设计模式与体系结构课程设计 周 宇 College of Information Science and Technology
PHP +MySQL快速入門 Lesson 4.
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
XSS & SQL Injection理論 2014/7/29 許子謙.
专题4:JSP脚本和指令.
例外處理(Exception Handling)
Arena System Technology Architecture 系统技术架构 1、Database V2(Lotus Notes)V3(Oracle8i) 2、Application Server SilverStream2.53 (Java as server side programming.
課程名稱:資料庫系統 授課老師:李春雄 博士
JSP自定义标签技术的分析与应用 ----Custom Tag 的分析与应用
胡鹏 王慧锋 TEL: 数据库系统原理课程设计 实验环节1 胡鹏 王慧锋 TEL:
崑山科技大學資訊管理系 伺服網頁程式設計 系統開發細部流程 教師:游峰碩.
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
進階 WWW 程式設計 -- PHP Regular Expression 靜宜大學資訊管理學系 蔡奇偉副教授 2004
MySQL.
使用ADO.NET访问数据 数据库连接 C#程序设计课程组.
Oracle Containers for J2EE(OC4J) 独立版
DWR WEB开发交流 1、自我介绍 2、DWR概述 3、DWR DEMO介绍 4、DWR实现机制 5、DWR配置说明 6、JS开发注意事项.
第一讲 J2EE基础 博和利初级培训 —开发技能.
郑晟 昆明理工大学 云南省计算机技术应用重点实验室
第11章 Android客户端与服务器交互.
MySQL管理 透過phpmyadmin來完成(MySQL的管理系統)
Python联合服务器的使用.
架站實做—AppServ
Sym社区系统商业版 背景、功能以及技术架构简介.
透過YouTuBe API取得資料 建國科技大學 資管系 饒瑞佶 2018/1 V1.
SDA(Standard development architecture)框架介绍
第十二章 过滤器.
Java Server Faces 参考书籍 Java Server Faces 核心编程.
1 Session对象的特性 Session 状态对象 Session 对象常用的方法有: Session 对象常用的属性有:
OceanBase 0.4:从API到SQL 日照
第二章 Java语法基础.
Dubbo介绍 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成.
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
課程名稱:資料庫系統 授課老師:李春雄 博士
第2章 Java语言基础.
第二章 Java基础语法 北京传智播客教育
第21章 Spring 的MVC框架 Spring不但一个很好的集成框剪,它还提供了构建Web应用程序的全功能MVC模块。Spring 的MVC框架非常强大并不逊色于其他专业的Web框架,如Struts、WebWork。但在国内Spring MVC应用的并不是特别多,原因可能是Struts太深入人心的缘故吧。
表单页面 表单是用户利用浏览器对Web站点网络数据库进行查询的一种界面,用户利用表单可以输入信息或选择选项等,然后将这些信息提交给服务器进行处理。通过表单,既可以将浏览器的信息发送到Internet服务器上,同时表单也可以使用户与站点的浏览者交互或从浏览者那里收集信息。它是网页的设计者和使用者相互交流的工具。表单对象包括文本域(单行、多行、密码)、列表、菜单、复选框、单选框、按钮等。
Presentation transcript:

简单的介绍,简单的配置,简单的扩展 By jfm Shiro入门学习手册 简单的介绍,简单的配置,简单的扩展 By jfm

一,shiro简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密。  验证用户  对用户执行访问控制,如:  判断用户是否拥有角色admin。 判断用户是否拥有访问的权限  在任何环境下使用 Session API。例如CS程序。  可以使用多个用户数据源。例如一个是oracle用户库,另外一个是mysql用户库。  单点登录(SSO)功能。  “Remember Me”服务 ,类似购物车的功能,shiro官方建议开启。

Shiro的4大部分——身份验证,授权,会话管理和加密  Authentication:身份验证,简称“登录”。  Authorization:授权,给用户分配角色或者权限资源  Session Management:用户session管理器,可以让CS程序也使用session来控制权限  Cryptography:把JDK中复杂的密码加密方式进行封装。

除了以上功能,shiro还提供很多扩展  Web Support:主要针对web应用提供一些常用功能。  Caching:缓存可以使应用程序运行更有效率。  Concurrency:多线程相关功能。  Testing:帮助我们进行测试相关功能  "Run As":一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。  “Remember Me”:记住用户身份,提供类似购物车功能。

Subject: Subject 是与程序进行交互的对象,可以是人也可以是服务或者其他,通常就理解为用户。 所有Subject 实例都必须绑定到一个SecurityManager上。我们与一个 Subject 交互,运行时shiro会自动转化为与 SecurityManager交互的特定 subject的交互。

SecurityManager: Realms: SecurityManager 是 Shiro的核心,初始化时协调各个模块运行。然而,一旦 SecurityManager协调完毕,SecurityManager 会被单独留下,且我们只需要去操作Subject即可,无需操作SecurityManager 。 但是我们得知道,当我们正与一个 Subject 进行交互时,实质上是 SecurityManager在处理 Subject 安全操作。 Realms: Realms在 Shiro中作为应用程序和安全数据之间的“桥梁”或“连接器”。他获取安全数据来判断subject是否能够登录,subject拥有什么权限。他有点类似DAO。在配置realms时,需要至少一个realm。而且Shiro提供了一些常用的 Realms来连接数据源,如LDAP数据源的JndiLdapRealm,JDBC数据源的JdbcRealm,ini文件数据源的IniRealm,properties文件数据源的PropertiesRealm,等等。我们也可以插入自己的 Realm实现来代表自定义的数据源。 像其他组件一样,Realms也是由SecurityManager控制

小结:

1.Subject(org.apache.shiro.subject.Subject): 简称用户 2.SecurityManager(org.apache.shiro.mgt.SecurityManager) 如上所述,SecurityManager是shiro的核心,协调shiro的各个组件 3.Authenticator(org.apache.shiro.authc.Authenticator): 登录控制 注:Authentication Strategy (org.apache.shiro.authc.pam.AuthenticationStrategy) 如果存在多个realm,则接口AuthenticationStrategy会确定什么样算是登录成功(例如,如果一个Realm成功,而其他的均失败,是否登录成功?)。

4.Authorizer(org.apache.shiro.authz.Authorizer) : 决定subject能拥有什么样角色或者权限。 5.SessionManager(org.apache.shiro.session.SessionManager) : 创建和管理用户session。通过设置这个管理器,shiro可以在任何环境下使用session。 6.CacheManager(org.apahce.shiro.cache.CacheManager) : 缓存管理器,可以减少不必要的后台访问。提高应用效率,增加用户体验。 7.Cryptography(org.apache.shiro.crypto.*) : Shiro的api大幅度简化java api中繁琐的密码加密。 8.Realms(org.apache.shiro.realm.Realm) : 程序与安全数据的桥梁

二,简单配置 注:这里只介绍spring配置模式。 因为官方例子虽然中有更加简洁的ini配置形式,但是使用ini配置无法与spring整合。而且两种配置方法一样,只是格式不一样。 涉及的jar包 Jar包名称 版本 核心包shiro-core 1.2.0 Web相关包shiro-web 缓存包shiro-ehcache 与spring整合包shiro-spring Ehcache缓存核心包ehcache-core 2.5.3 Shiro自身日志包slf4j-jdk14 1.6.4

使用maven时,在pom中添加依赖包 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.0</version> </dependency> <artifactId>shiro-web</artifactId> <artifactId>shiro-ehcache</artifactId>

<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.2.0</version> </dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.5.3</version> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.6.4</version>

1.在web.xml中配置shiro的过滤器 Spring整合配置 <!-- Shiro filter--> <filter-name>shiroFilter</filter-name>  <filter-class>  org.springframework.web.filter.DelegatingFilterProxy   </filter-class>   </filter>   <filter-mapping>   <filter-name>shiroFilter</filter-name>   <url-pattern>/*</url-pattern>   </filter-mapping>  

2.在Spring的applicationContext.xml中添加shiro配置 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <property name="loginUrl" value="/login" /> <property name="successUrl" value="/login/loginSuccessFull" /> <property name="unauthorizedUrl" value="/login/unauthorized" /> <property name="filterChainDefinitions"> <value> /home* = anon / = anon /logout = logout /role/** = roles[admin] /permission/** = perms[permssion:look] /** = authc </value> </property> </bean>

securityManager:这个属性是必须的。 loginUrl :没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。 successUrl :登录成功默认跳转页面,不配置则跳转至”/”。如果登陆前点击的一个需要登录的页面,则在登录自动跳转到那个需要登录的页面。不跳转到此。 unauthorizedUrl :没有权限默认跳转的页面。

org.apache.shiro.web.filter.authc.AnonymousFilter 过滤器简称 对应的java类 anon org.apache.shiro.web.filter.authc.AnonymousFilter authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter port org.apache.shiro.web.filter.authz.PortFilter rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter ssl org.apache.shiro.web.filter.authz.SslFilter user org.apache.shiro.web.filter.authc.UserFilter logout org.apache.shiro.web.filter.authc.LogoutFilter

anon:例子/admins/**=anon 没有参数,表示可以匿名使用。 authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数 roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。 perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

rest:例子/admins/user/. =rest[user],根据请求的方法,相当于/admins/user/ rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。 port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString 是你访问的url里的?后面的参数。 authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证

ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查 注:anon,authcBasic,auchc,user是认证过滤器, perms,roles,ssl,rest,port是授权过滤器

3. 在applicationContext.xml中添加securityManagerper配置 <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- 单realm应用。如果有多个realm,使用‘realms’属性代替 --> <property name="realm" ref="sampleRealm" /> <property name="cacheManager" ref="cacheManager" /> </bean> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager" />

4.配置jdbcRealm <bean id="sampleRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm"> <property name="dataSource" ref="dataSource" /> <property name="authenticationQuery" value="select t.password from my_user t where t.username = ?" /> <property name="userRolesQuery" value="select a.rolename from my_user_role t left join my_role a on t.roleid = a.id where t.username = ? " /> <property name="permissionsQuery" value="SELECT B.PERMISSION FROM MY_ROLE T LEFT JOIN MY_ROLE_PERMISSION A ON T.ID = A.ROLE_ID LEFT JOIN MY_PERMISSION B ON A.PERMISSION = B.ID WHERE T.ROLENAME = ? " /> <property name="permissionsLookupEnabled" value="true" /> <property name="saltStyle" value="NO_SALT" /> <property name="credentialsMatcher" ref="hashedCredentialsMatcher" /> </bean>

dataSource 数据源,配置不说了。 authenticationQuery 登录认证用户的查询SQL,需要用登录用户名作为条件,查询密码字段。 userRolesQuery 用户角色查询SQL,需要通过登录用户名去查询。查询角色字段 permissionsQuery 用户的权限资源查询SQL,需要用单一角色查询角色下的权限资源,如果存在多个角色,则是遍历每个角色,分别查询出权限资源并添加到集合中。 permissionsLookupEnabled 默认false。False时不会使用permissionsQuery的SQL去查询权限资源。设置为true才会去执行。 saltStyle 密码是否加盐,默认是NO_SALT不加盐。加盐有三种选择CRYPT,COLUMN,EXTERNAL。详细可以去看文档。这里按照不加盐处理。 credentialsMatcher 密码匹配规则。下面简单介绍。

<bean id="hashedCredentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <property name="hashAlgorithmName" value="MD5" /> <property name="storedCredentialsHexEncoded" value="true" /> <property name="hashIterations" value="1" /> </bean> hashAlgorithmName 必须的,没有默认值。可以有MD5或者SHA-1,如果对密码安全有更高要求可以用SHA-256或者更高。这里使用MD5 storedCredentialsHexEncoded 默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码 hashIterations 迭代次数,默认值是1。

登录JSP页面 <form action="login" method="post"> <td>用户名:</td> <td><input type="text" name="username"></input></td> <td>密码:</td> <td><input type="password" name="password"></input></td> <td>记住我</td> <td><input type="checkbox" name="rememberMe" /></td> 注:登录JSP,表单action与提交方式固定,用户名与密码的name也是固定。

5.配置shiro注解模式 <!-- 开启Shiro注解的Spring配置方式的beans。在lifecycleBeanPostProcessor之后运行 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor" /> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager" /> </bean> 注意:在与springMVC整合时必须放在springMVC的配置文件中。 Shiro在注解模式下,登录失败,与没有权限均是通过抛出异常。并且默认并没有去处理或者捕获这些异常。在springMVC下需要配置捕获相应异常来通知用户信息,如果不配置异常会抛出到页面

<bean class="org. springframework. web. servlet. handler <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="org.apache.shiro.authz.UnauthorizedException"> /unauthorized </prop> <prop key="org.apache.shiro.authz.UnauthenticatedException"> /unauthenticated </props> </property> </bean>

@RequiresAuthentication 验证用户是否登录,等同于方法subject.isAuthenticated() 结果为true时。 @ RequiresUser 验证用户是否被记忆,user有两种含义: 一种是成功登录的(subject.isAuthenticated() 结果为true); 另外一种是被记忆的( subject.isRemembered()结果为true)。 @ RequiresGuest 验证是否是一个guest的请求,与@ RequiresUser完全相反。 换言之,RequiresUser == ! RequiresGuest 。 此时subject.getPrincipal() 结果为null.

@RequiresPermissions @ RequiresRoles 例如:@RequiresRoles("aRoleName"); void someMethod(); 如果subject中有aRoleName角色才可以访问方法someMethod。如果没有这个权限则会抛出异常AuthorizationException。 @RequiresPermissions 例如: @RequiresPermissions( {"file:read", "write:aFile.txt"} ) void someMethod(); 要求subject中必须同时含有file:read和write:aFile.txt的权限才能执行方法someMethod()。否则抛出异常AuthorizationException。

三.简单扩展 自定义realm: <!--自定义的myRealm 继承自AuthorizingRealm,也可以选择shiro提供的 --> <bean id="myRealm" class="com.yada.shiro.MyReam"></bean> //这是授权方法 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String userName = (String) getAvailablePrincipal(principals); //TODO 通过用户名获得用户的所有资源,并把资源存入info中 ……………………. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setStringPermissions(set集合); info.setRoles(set集合); info.setObjectPermissions(set集合); return info; }

//这是认证方法 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //token中储存着输入的用户名和密码 UsernamePasswordToken upToken = (UsernamePasswordToken)token; //获得用户名与密码 String username = upToken.getUsername(); String password = String.valueOf(upToken.getPassword()); //TODO 与数据库中用户名和密码进行比对。比对成功则返回info,比对失败则抛出对应信息的异常AuthenticationException ………………….. SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password .toCharArray(),getName()); return info; }

自定义登录 //创建用户名和密码的令牌 UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(),user.getPassWord()); //记录该令牌,如果不记录则类似购物车功能不能使用。 token.setRememberMe(true); //subject理解成权限对象。类似user Subject subject = SecurityUtils.getSubject(); try { subject.login(token); } catch (UnknownAccountException ex) {//用户名没有找到。 } catch (IncorrectCredentialsException ex) {//用户名密码不匹配。 }catch (AuthenticationException e) {//其他的登录错误 } //验证是否成功登录的方法 if (subject.isAuthenticated()) {

Subject subject = SecurityUtils.getSubject(); subject.logout(); 自定义登出 Subject subject = SecurityUtils.getSubject(); subject.logout(); 基于编码的角色授权实现 Subject currentUser = SecurityUtils.getSubject();   if (currentUser.hasRole("administrator")) {       //拥有角色administrator } else {       //没有角色处理 }   断言方式控制 Subject currentUser = SecurityUtils.getSubject();   //如果没有角色admin,则会抛出异常,someMethod()也不会被执行 currentUser.checkRole(“admin");   someMethod();  

基于编码的资源授权实现 断言方式控制 Subject currentUser = SecurityUtils.getSubject(); if (currentUser.isPermitted("permssion:look")) {       //有资源权限 } else {       //没有权限 }   断言方式控制 Subject currentUser = SecurityUtils.getSubject();   //如果没有资源权限则会抛出异常。 currentUser.checkPermission("permssion:look");   someMethod();  

在JSP上的TAG实现 标签名称 标签条件(均是显示标签内容) <shiro:authenticated> 登录之后 <shiro:notAuthenticated> 不在登录状态时 <shiro:guest> 用户在没有RememberMe时 <shiro:user> 用户在RememberMe时 <shiro:hasAnyRoles name="abc,123" > 在有abc或者123角色时 <shiro:hasRole name="abc"> 拥有角色abc <shiro:lacksRole name="abc"> 没有角色abc <shiro:hasPermission name="abc"> 拥有权限资源abc <shiro:lacksPermission name="abc"> 没有abc权限资源 <shiro:principal> 默认显示用户名称

7. 默认,添加或删除用户的角色 或资源 ,系统不需要重启,但是需要用户重新登录。 即用户的授权是首次登录后第一次访问需要权限页面时进行加载。 但是需要进行控制的权限资源,是在启动时就进行加载,如果要新增一个权限资源需要重启系统。 8. Spring security 与。Shiro对很多其他的框架兼容性更好,号称是无缝集成。apache shiro 差别: shiro配置更加容易理解,容易上手;security配置相对比较难懂。 在spring的环境下,security整合性更好 shiro 不仅仅可以使用在web中,它可以工作在任何应用环境中。 在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的。 Shiro提供的密码加密使用起来非常方便。 9. 控制精度: 注解方式控制权限只能是在方法上控制,无法控制类级别访问。 过滤器方式控制是根据访问的URL进行控制。允许使用*匹配URL,所以可以进行粗粒度,也可以进行细粒度控制。