现在的位置: 首页 > 综合 > 正文

权限组件_shiro

2017年12月27日 ⁄ 综合 ⁄ 共 7018字 ⁄ 字号 评论关闭

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)
...

抱歉!评论已关闭.