api-docs:
shiro api-链接:http://shiro.apache.org/static/1.2.3/apidocs/
shiro4web docs-链接:http://shiro.apache.org/web.html
shiro docs-链接:http://shiro.apache.org/reference.html
入门-链接:http://www.infoq.com/cn/articles/apache-shiro
入门手册(En)-链接:http://stephansun.iteye.com/blog/1472426
开涛-跟我学shiro系列-教程:http://jinnianshilongnian.iteye.com/blog/20183983
核心API:
Authentication:身份认证/登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
--Subject:主体,可以看到主体可以是任何可以与应用交互的“用户”,是一个抽象概念;
--SecurityManager:安全管理器。所有Subject都绑定到SecurityManager,它是Shiro的核心,所有具体的交互都通过SecurityManager进行控制;它管理着所有Subject、且负责进行认证和授权、及会话、缓存的管理。
---Authenticator:认证器,负责主体认证的
---Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;
--Realm:域,Shiro从Realm获取安全数据,可以把Realm看成DataSource,即安全数据源。
Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。
---SessionManager:
SessionDAO
CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据基本
上很少去改变,放到缓存中后可以提高访问的性能
Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密/解密的。
principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。
credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
---java_demo:
protected void login(String configFile, String username, String password) { //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile); //2、得到SecurityManager实例 并绑定给SecurityUtils SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证) Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); subject.login(token); }
---shiro.ini
Shiro提供的INI配置可以理解为是一个IoC/DI容器,它从一个根对象securityManager开始。
1、对象名=全限定类名 相对于调用public无参构造器创建对象
2、对象名.属性名=值 相当于调用setter方法设置常量值
3、对象名.属性名=$对象引用 相当于调用setter方法设置对象引用
[main] #提供了对根对象securityManager及其依赖的配置 securityManager=org.apache.shiro.mgt.DefaultSecurityManager ………… securityManager.realms=$jdbcRealm [users] #提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2 username=password,role1,role2 [roles] #提供了角色及权限之间关系的配置,角色=权限1,权限2 role1=permission1,permission2 [urls] #用于web,提供了对web url拦截相关的配置,url=拦截器[参数],拦截器 /index.html = anon /admin/** = authc, roles[admin], perms["permission1"]
---授权方式
---Shiro支持三种方式的授权: --编程式:通过写if/else授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole(“admin”)) { //有权限 } else { //无权限 } --注解式:通过在执行的Java方法上放置相应的注解完成: @RequiresRoles("admin") public void hello() { //有权限 } 没有权限将抛出相应的异常; --JSP/GSP标签:在JSP/GSP页面通过相应的标签完成: <shiro:hasRole name="admin"> <!— 有权限 —> </shiro:hasRole> 后续部分将详细介绍如何使用。
--realm:
1.默认的Realm实现:
org.apache.shiro.realm.text.IniRealm:
org.apache.shiro.realm.text.PropertiesRealm:
org.apache.shiro.realm.jdbc.JdbcRealm:
2。自定义的Realm实现
---Web shiro:
1。入口filter:
1.1 <!--- shiro 1.2 --> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <context-param> <param-name>shiroEnvironmentClass</param-name> <param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value><!-- 默认先从/WEB-INF/shiro.ini,如果没有找classpath:shiro.ini --> </context-param> <context-param> <param-name>shiroConfigLocations</param-name> <param-value>classpath:shiro.ini</param-value> </context-param> 1.2 集成到Servlet <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.web ini配置
anon拦截器表示匿名访问
authc拦截器表示需要身份认证通过后才能访问
roles[admin]拦截器表示需要有admin角色授权才能访问
perms["user:create"]拦截器表示需要有“user:create”权限才能访问
3.如果集成了Servlet,那么根据ini中的配置提供相应的Servlet实现
4.JSP标签
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <shiro:guest> 欢迎游客访问,<a href="${pageContext.request.contextPath}/login.jsp">登录</a> </shiro:guest> <shiro:user> 欢迎[<shiro:principal/>]登录,<a href="${pageContext.request.contextPath}/logout">退出</a> </shiro:user> 等等……
5.shiro Session的会话管理
5.1
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。
即直接使用Shiro Session可以直接替换如Web容器的http Session。
5.2
Session session = subject.getSession(); //登录成功后使用Subject.getSession()即可获取会话;
5.3
顶层组件SecurityManager直接继承了SessionManager,
SessionManager会话管理器管理着应用中所有Subject的会话的创建、维护、删除、失效、验证等工作。
5.4
Shiro提供了三个默认会话管理器实现:
DefaultSessionManager:DefaultSecurityManager使用的默认实现,用于JavaSE环境;
ServletContainerSessionManager:DefaultWebSecurityManager使用的默认实现,用于Web环境,其直接使用Servlet容器的会话;
DefaultWebSessionManager:用于Web环境的实现,可以替代ServletContainerSessionManager,自己维护着会话,直接废弃了Servlet容器的会话管理。
6.shiro缓存机制
Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。
7.集成Spring
7.1 入口filter
<filter> <filter-name>shiroFilter</filter-name> <!-- 绑定配置shiroFilter给Spring容器--> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
7.2 spring-shiro-web.xml
把之前的ini配置翻译为此处的spring xml配置方式
<!-- Shiro生命周期处理器--> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/> <!-- Shiro的Web过滤器 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> <property name="arguments" ref="securityManager"/> </bean> <!-- 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="userRealm"/> <property name="sessionManager" ref="sessionManager"/> <property name="cacheManager" ref="cacheManager"/> </bean> <!-- 会话验证调度器 --> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <!-- 会话DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <!-- 会话Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- 会话ID生成器 --> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 会话管理器 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <!-- 缓存管理器 使用Ehcache实现 --> <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/> </bean> <!-- 凭证匹配器 --> <bean id="credentialsMatcher" ...> <!-- Realm实现 --> <bean id="userRealm" ...> <!-- 开启Shiro Spring AOP权限注解的支持 --> <aop:config proxy-target-class="true"></aop:config> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean>
7.3 shiro注解
Shiro提供了Spring AOP集成用于权限注解的解析和验证。
@RequiresAuthentication
@RequiresUser
@RequiresGuest
@RequiresRoles(value={“admin”, “user”}, logical= Logical.AND)
@RequiresPermissions (value={“user:a”, “user:b”}, logical= Logical.OR)
...