1. 程式人生 > >shiro認證策略,授權

shiro認證策略,授權

有具體問題的可以參考之前的關於shiro的博文,關於shiro的博文均是一次工程的內容 !

 

認證策略:

 

修改認證策略: applicationContext.xml
     <!-- 認證器 -->
         <bean id="autheniicator"
          class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
            <property name="realms">
                 <list>
                      <ref
bean="jdbcRealm"/> <ref bean="SecondRealm"/> </list> </property> <!-- 認證策略 --> <property name="authenticationStrategy"> <bean class="org.apache.shiro.authc.pam.AllSuccessfulStrategy"></bean> </property>
</bean>

 

 

 授權:

 授權之前的小說明:

 

此時的訪問並沒有問題:

 

 注:在做授權的時候需要在securityManager 中讀取realms

 <bean id="securityManager"  class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="cacheManager" ref
="cacheManager"/> <property name="authenticator" ref="autheniicator"></property> <property name="realms"> <list> <ref bean="jdbcRealm"/> <ref bean="SecondRealm"/> </list> </property> </bean>

 

 

 

 

 

程式碼開始 新建一個類

list.sjp頁面中

<body>
    list.
    <br>
    <a href="admin.jsp">TO Admin</a>
    <br>
    <a href="user.jsp">TO User</a>
    <br>
    <a href="shiro/logout">Logout</a>
  </body>

 

 

 applicationContext.jsp

<!--
            配置那些頁面需要受保護,以及訪問這些頁面需要的的許可權
            1)anon 可以被匿名訪問
            2)authc 必須認證即登陸後才可以訪問的頁面
            3).logout登出
            4)roles 角色過濾器
        -->
        <property name="filterChainDefinitions">
            <value>
                /login.jsp = anon
                  /shiro/login = anon
                  /shiro/logout = logout
                  
                  /user.jsp = roles[user]
                  /admin.jsp = roles[admin]
                  
                # everything else requires authentication:
                /** = authc
            </value>
        </property>

 此時點選訪問user.jsp/admin.jsp的超連結都會去沒有許可權訪問的頁面

 

 授權流程:

需要實現AuthorizingRealm的.....
public abstract class AuthorizingRealm extends  AuthenticatingRealm
        implements Authorizer, Initializable,  PermissionResolverAware, RolePermissionResolverAware
AuthorizingRealm繼承 AuthenticatingRealm,但是沒有實現 AuthenticatingRealmdoGetAuthenticationInfo的方法 所以認證和授權只需要繼承 AuthorizingRealm就可以了,同時實現它的兩個抽象方法
public class ShiroReamlTest extends AuthorizingRealm{
     
     //授權
     protected AuthorizationInfo  doGetAuthorizationInfo(PrincipalCollection principals) {
           // TODO Auto-generated method stub
           return null;
     }
     
     //加密
     protected AuthenticationInfo  doGetAuthenticationInfo(AuthenticationToken token) throws  AuthenticationException {
           // TODO Auto-generated method stub
           return null;
     }
}

 

授權需要繼承的類以及實現的方法

 

 實現:

public class ShiroRealm extends AuthorizingRealm {
     @Override
     protected AuthenticationInfo  doGetAuthenticationInfo(AuthenticationToken arg0) throws  AuthenticationException {
        。。。。。。。
     }
     //授權
     @Override
     protected AuthorizationInfo  doGetAuthorizationInfo(PrincipalCollection principals) {
           
           System.out.println(principals);
           //1.PrincipalCollection獲取登陸的使用者資訊
           Object principal = principals.getPrimaryPrincipal();
           System.out.println(principal);
           //2.利用登陸的使用者資訊獲取當前使用者角色的許可權
           Set<String> roles = new HashSet<String>();
           roles.add("user");
           if("admin".equals(principal)){
                roles.add("admin");
           }
           //3.建立SimpleAuthorizationInfo,並且設定其reles屬性
           SimpleAuthorizationInfo info = new  SimpleAuthorizationInfo(roles);
           //4.
           return info;
     }
     
     
}

 

 此時的設定之後 是可以成功訪問的!