Shiro学习笔记

Shiro :权限菜单框架.
 
Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密。
 
 
用户认证
用户认证,用户去访问系统,系统要验证用户身份的合法性。最常用的用户身份验证的方法:1、用户名密码方式、2、指纹打卡机、3、基于证书验证方法。。系统验证用户身份合法,用户方可访问系统的资源
 
关键对象 
subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份认证。
principal:身份信息,通常是唯一的,一个主体还有多个身份信息,但是都有一个主身份信息(primary principal)
credential:凭证信息,可以是密码 、证书、指纹。
 
总结:主体在进行身份认证时需要提供身份信息和凭证信息。
 
 
用户授权
用户授权,简单理解为访问控制,在用户认证通过后,系统对用户访问资源进行控制,用户具有资源的访问权限方可访问。
 
权限模型
主体(账号、密码)
资源(资源名称、访问地址)
权限(权限名称、资源id)
角色(角色名称)
角色和权限关系(角色id、权限id)
主体和角色关系(主体id、角色id)
 
1.1.1     权限模型
主体(账号、密码)
资源(资源名称、访问地址)
权限(权限名称、资源id
角色(角色名称)
角色和权限关系(角色id、权限id
主体和角色关系(主体id、角色id
 
如下图:
通常企业开发中将资源和权限表合并为一张权限表,如下:
资源(资源名称、访问地址)
权限(权限名称、资源id
合并为:
权限(权限名称、资源名称、资源访问地址)
 
 
上图常被称为权限管理的通用模型,不过企业在开发中根据系统自身的特点还会对上图进行修改,但是用户、角色、权限、用户角色关系、角色权限关系是需要去理解的。
 
 
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" />
 
配置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>
 
配置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.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
  <props>
  <prop key="org.apache.shiro.authz.UnauthorizedException">
  /unauthorized
  </prop>
  <prop key="org.apache.shiro.authz.UnauthenticatedException">
  /unauthenticated
  </prop>
  </props>
  </property>
</bean>
posted @ 2018-04-28 11:39  杨斌_济南  阅读(260)  评论(0编辑  收藏  举报