【shiro】認證與授權
l shiro框架的核心功能:
認證
授權
會話管理
加密
1.認證
shiro框架認證流程
applicationCode:應用程式程式碼,由開發人員負責開發
Subject:框架提供的介面,指當前使用者物件
SecurityManager:安全管理器,框架提供,主體進行認證和授權都是通過securityManager進行
Realm:框架提供,也可以自己編寫,類似於dao,用於訪問許可權資料
認證的操作步驟
第一步:pom.xml檔案中新增shiro的依賴
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.2.2</version> </dependency>
第二步:web.xml中配置shiro的核心過濾器
<filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意:如果shiro框架與Strust2框架一起使用,shiroFilter需要配置在Strust2核心過濾器的前面
第三步:在Spring配置檔案中進行相關配置
bean的id需要與web.xml中配置的filter的name一致
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- 注入安全管理器物件 --> <property name="securityManager" ref="securityManager" /> <!-- 注入相關頁面訪問URL --> <property name="loginUrl" value="/login.jsp" /> <!-- 登入頁面 --> <property name="successUrl" value="/index.jsp" /><!-- 認證成功後需要跳轉到的頁面 --> <property name="unauthorizedUrl" value="/unauthorized.jsp" /><!-- 認證失敗需要跳轉的頁面--> <!-- 注入URL攔截規則 --> <property name="filterChainDefinitions"> <value> /css/** = anon /js/** = anon /images/** = anon /validatecode.jsp* = anon /login.jsp = anon /user_login.action = anon /page_base_staff.action = perms["staff-list"] /* = authc </value> </property> </bean>
shiroFilter中,還需要注入如下的屬性:
filterChainDefinitions:定義shiro的攔截規則
authc:代表shiro框架提供的一個過濾器,這個過濾器用於判斷當前使用者是否已經完成認證,如果當前使用者已經認證,就放行,如果當前使用者沒有認證,跳轉到登入頁面
anon:代表shiro框架提供的一個過濾器,允許匿名訪問
perms:代表shiro框架提供的一個過濾器,表示使用者需要具有[]內的許可權,才可以訪問
SecurityManager
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm" />
<property name="cacheManager" ref="cacheManager" />
</bean>
SecurityManager中需要注入如下屬性
Realm:
可自己編寫也可使用框架提供,Realm的核心是認證和授權兩個方法
<!-- 註冊realm -->
<bean id="bosRealm" class="com.itheima.bos.realm.BosRealm"></bean>
CacheManager:
將使用者許可權存放到快取中去,避免每次傳送請求都去查詢使用者許可權
<!-- 註冊緩衝管理器 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml" />
</bean>
ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
第四步:在自己的login方法中使用shiro的登入驗證
public String login() {
public String login() {
// 使用shiro框架提供的方式進行認證
Subject subject = SecurityUtils.getSubject();
String md5 = MD5Utils.md5(user.getPassword());
UsernamePasswordToken token = new UsernamePasswordToken(
user.getUsername(), md5);
try {
subject.login(token);//該方法執行,將會最終呼叫realm中的認證方法對登入賬號進行校驗
User user = (User) subject.getPrincipal();
ActionContext.getContext().getSession().put("loginUser", user);
} catch (Exception e) {//沒有異常丟擲,說明校驗通過
e.printStackTrace();
this.addActionError("使用者名稱或密碼錯誤,登入失敗!");
return INPUT;
}
return "loginSuccess";
}
Subject subject = SecurityUtils.getSubject();
String md5 = MD5Utils.md5(user.getPassword());
UsernamePasswordToken token = new UsernamePasswordToken(
user.getUsername(), md5);
try {
subject.login(token);//該方法執行,將會最終呼叫realm中的認證方法對登入賬號進行校驗
User user = (User) subject.getPrincipal();
ActionContext.getContext().getSession().put("loginUser", user);
} catch (Exception e) {//沒有異常丟擲,說明校驗通過
e.printStackTrace();
this.addActionError("使用者名稱或密碼錯誤,登入失敗!");
return INPUT;
}
return "loginSuccess";
}
第五步:編寫realm的認證方法
繼承AuthorizingRealm,實現其中的兩個方法,認證:doGetAuthorizationInfo和授權:doGetAuthenticationInfo
public class BosRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken arg0) throws AuthenticationException {
// TODO Auto-generated method stub
return null;
}
}
認證方法的程式碼如下
@Override
public AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken myToken = (UsernamePasswordToken) token;
User user = uDao.queryByUsername(myToken.getUsername());
if (user == null)// 如果使用者沒有查到,返回null
return null;
// 如果使用者可以查到,再由框架比對資料庫中查詢到的密碼和頁面提交的密碼是否一致
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,
user.getPassword(), this.getName());
return info;
}
2.授權
第一步:在applicationContext的shiroFilter中的filterChainDefinition中新增需要進行許可權校驗的action
如上面記錄的/page_base_staff.action = perms["staff-list"],即表示,使用者需要有staff-list許可權,才有權訪問/page_base_staff.action
-------------------------------------------------------------------------
授權感覺自己還是沒有目標,暫時不寫了