Shiro入門一些筆記
阿新 • • 發佈:2018-11-09
Shiro實現基本流程
- 獲取當前的Subject.呼叫SecurityUtills.getSubject();
- 測試當前的使用者已經被認證,即是否已經登入,呼叫Subject的isAuthenticated()
- 若沒有被認證,則把使用者名稱和密碼封裝為UsernamePasswordToken 物件
- 建立一個表單
- 把請求提交到Springmvc的handler
- 獲得使用者和密碼
- 執行登入:呼叫Subjec的login(token) 方法
- 自定義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 使演算法值不相同
如何設定加鹽
- 如何做到 doGetAuthenticationInfo()方法返回值建立 SimpleAuthenticationInfo 物件的時候,需要使用SimpleAuthenticationInfo(credentials, credentials, credentialsSalt, realmName)構造方法
- 使用ByteSource.Util.bytes()來計算鹽值; 我們使用使用者名稱 一般使用者名稱是不能重複的。
- 鹽值要唯一:一般使用隨機字串或者userid
- 使用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就可以同時實現兩個抽象方法