shiro权限健康安全验证框架

来源:互联网 发布:我的世界0.15.1枪械js 编辑:程序博客网 时间:2024/05/21 23:00
shiro权限验证框架

1.什么是Shiro?

    Shiro 是一个用 Java 语言实现的框架,通过一个简单易用的 API 提供身份验证和授权。使用 Shiro,您就能够为您的应用程序提供安全性而又无需从头编写所有代码。
 

2.为什么要用Shiro?

    shiro在大多数的企业级系统中,我们一般都是采用角色关联资源,然后对用户指定一些角色,这样用户就拥有了一些url,菜单等资源,登陆后页面即可相应的一些功能,但是这种情况下存在这安全问题,因为用户页面只是没有显示相应的功能菜单,若某个用户知道url地址,直接去访问,系统是没法控制该用户操作的,于是便迎来了权限验证框架这一说。
 

3.Shiro能够有哪些方式控制权限呢?

   同样shiro有两种配置方式,xml和注解,当然xml相对而言不灵活,只能指定经过认证授权后可以访问哪些页面以及不能访问哪些页面,对于注解就灵活一些了,可以适应于各种情景,
方法上加上
@RequiresAuthentication  (验证用户是否登录)
@RequiresUser  验证用户是否被记忆,user有两种含义:一种是成功登录的(subject.isAuthenticated() 结果为true);另外一种是被记忆的(subject.isRemembered()结果为true)。
@RequiresGuest 验证是否是一个guest的请求
@RequiresRoles 如果subject中有aRoleName角色才可以访问方法someMethod。如果没有这个权限则会抛出异常AuthorizationException。
@RequiresPermissions  要求subject中必须同时含有file:read和write:aFile.txt的权限才能执行方法someMethod()。否则抛出异常AuthorizationException。
 
 

4.说说怎样使用Shiro?

 
先添加 spring-shiro.xml 配置
具体如下:
复制代码
<span style="font-size: 18px;"><?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"    default-lazy-init="true"><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">    <property name="securityManager" ref="securityManager" />    <property name="loginUrl" value="/shiro/turnlogin.do" />    <property name="successUrl" value="/shiro/success.do" />    <property name="unauthorizedUrl" value="/shiro/unauth.do" />    <property name="filterChainDefinitions">        <value>            /shiro/success = authc <!-- authc 表示需要认证才能访问的页面 -->            /shiro/success = authc, perms[/home]  <!-- perms 表示需要该权限才能访问的页面 -->        </value>    </property></bean><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">    <property name="realm" ref="myShiroRealm"></property></bean><bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /><bean id="myShiroRealm" class="com.hfmx.util.shiro.MyShiroRealm">    <!-- businessManager 用来实现用户名密码的查询 -->    <span style="font-family: Arial, Helvetica, sans-serif;"><!-- </span><span style="font-family: Arial, Helvetica, sans-serif;"><property name="shiroService" ref="shiroService" />  </span><span style="font-family: Arial, Helvetica, sans-serif;">--></span><span style="font-family: Arial, Helvetica, sans-serif;"></span></bean><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">      <property name="exceptionMappings">          <props>              <!--登录-->              <prop key="org.apache.shiro.authz.UnauthenticatedException">                  redirect:/shiro/turnlogin.do              </prop>              <!--授权-->              <prop key="org.apache.shiro.authz.UnauthorizedException">                    redirect:/shiro/turnlogin.do              </prop>          </props>      </property>      <property name="defaultErrorView" value="s/403" /></bean></beans></span>
复制代码

 

在applicationContext中引入该文件
<import resource="classpath*:/spring-shiro.xml" />


在springMVC中加入:
<!-- 开启Shiro的注解,实现对Controller的方法级权限检查(如@RequiresRoles,@RequiresPermissions),需
借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证 -->  
<!-- 需要在 sprimg-MVC的配置文件中 -->    

复制代码
<span style="font-size: 18px;">
  <
bean id="controllerAdvisorAutoProxyCreator"       class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
      depends-on
="lifecycleBeanPostProcessor"/> <bean id="controllerAuthorizationAttributeSourceAdvisor"
      class
="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">   <property name="securityManager" ref="securityManager"/>  </bean>
</
span>
复制代码
 
上述这样就配置完毕了
 
我们要新建一个类MyShiroRealm ,继承AuthorizingRealm

重写doGetAuthorizationInfo() //获取授权信息
以及doGetAuthenticationInfo()//获取认证信息
这两个方法
 
因为公司系统 已经使用了一定时间了,用户登录这块已经很完善就仍然使用原来的,所以这里的doGetAuthenticationInfo方法 可以不做太多的处理,这里也把应有的流程贴出来
复制代码
    @Override    public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken at) throws AuthenticationException {                //1. 把AuthenticationToken 转化为 UsernamePasswordToken            UsernamePasswordToken token = (UsernamePasswordToken) at;                    //2. 从UsernamePasswordToken 中获取 username            String username = token.getUsername();            char[] password = token.getPassword();                    //3. 调用数据库的方法,从数据库中查询 username 对应的用户记录                    //4. 若用户不存在,则可以抛出 UnknownAccountException                            //5. 根据用户信息的情况,决定是否需要抛出其他的AuthenticationException 异常                //6. 根据用户的情况,来构建 AuthenticationInfo 对象并返回