【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 

-------------------------------------------------------------------------

授權感覺自己還是沒有目標,暫時不寫了

 

 

發佈了22 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章