1. 程式人生 > >Shiro入門一些筆記

Shiro入門一些筆記

Shiro實現基本流程

  1. 獲取當前的Subject.呼叫SecurityUtills.getSubject();
  2. 測試當前的使用者已經被認證,即是否已經登入,呼叫Subject的isAuthenticated()
  3. 若沒有被認證,則把使用者名稱和密碼封裝為UsernamePasswordToken 物件
  • 建立一個表單
  • 把請求提交到Springmvc的handler
  • 獲得使用者和密碼
  1. 執行登入:呼叫Subjec的login(token) 方法
  2. 自定義realm方法,從資料庫中獲取對應的記錄,返回給shiro
  • 實際上需要繼承org.apache.shiro.realm.AuthenticationToken 類
  • 實現doGetAuthenticationInfo(AuthenticationToken var1) 方法
  • 由shiro完成對密碼的比對

密碼的比對通過的方式:

是通過 CredentialsMatcher介面的doCredentialsMatch方法來進行的密碼的比對,匹配關鍵部分原始碼


    protected void assertCredentialsMatch(AuthenticationToken token, AuthenticationInfo info)
throws AuthenticationException { CredentialsMatcher cm = getCredentialsMatcher(); if (cm != null) { if (!cm.doCredentialsMatch(token, info)) { //not successful - throw an exception to indicate this: String msg = "Submitted credentials for token ["
+ token + "] did not match the expected credentials."; throw new IncorrectCredentialsException(msg); } } else { throw new AuthenticationException("A CredentialsMatcher must be configured in order to verify " + "credentials during authentication. If you do not wish for credentials to be examined, you " + "can configure an " + AllowAllCredentialsMatcher.class.getName() + " instance."); } }

為什麼使用MD5 鹽值加密Salt

相同的密碼就會有相同的MD5演算法值
需要加鹽值salt 使演算法值不相同

如何設定加鹽

  1. 如何做到 doGetAuthenticationInfo()方法返回值建立 SimpleAuthenticationInfo 物件的時候,需要使用SimpleAuthenticationInfo(credentials, credentials, credentialsSalt, realmName)構造方法
  2. 使用ByteSource.Util.bytes()來計算鹽值; 我們使用使用者名稱 一般使用者名稱是不能重複的。
  3. 鹽值要唯一:一般使用隨機字串或者userid
  4. 使用new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations);來計算鹽值加密後的密碼的值
     String hashAlgorithmName = "MD5";
        Object credentials = "123456";
        Object salt = ByteSource.Util.bytes("user");//加鹽
        int hashIterations = 1000;
        Object result = new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations);//實現加密演算法。
        System.out.println(result);

如何把一個字串加密為MD5

替換當前Realm的credentialsMacher 屬性,直接使用HashedCredentialsMacher 物件,並設定加密演算法即可。這裡需要在spring配置檔案中設定

    <!--配置realm-->
    <bean id="jdbcRealm" class="com.hjsjy.shiro.ShiroRealm">
        <property name="credentialsMatcher">
            <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
                <!--設定加密的型別 MD5-->
                <property name="hashAlgorithmName" value="MD5"/>
                <!--設定加密的次數 1000次-->
                <property name="hashIterations" value="1024"/> 
            </bean>
        </property>
    </bean>

shiro授權

授權需要繼承 AuthorizingRealm類,並實現 doGetAuthorizationInfo 放啊
AuthorzingRealm 類繼承自AuthenticatingRealm,但是沒有實現AuthenticatingRealm中的doGetAuthenticationInfo,所以認證和授權只需要繼承AuthorzingRealm就可以同時實現兩個抽象方法