1. 程式人生 > >Shiro-實現認證

Shiro-實現認證

 只需要認證,直接繼承AuthenticatingRealm 類就可以了

package com.atguigu.shiro.realms;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.realm.AuthenticatingRealm;

/**
 * 
 * @author Lee
 *
 */
public class ShiroRealm extends AuthenticatingRealm {

	private static final String MONSTER = "monster";
	private static final String UNKNOW = "unknow";

	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		
		// 1、將AuthenticationToken轉換為UsernamePasswordToken
		UsernamePasswordToken upToken = (UsernamePasswordToken) token;
		// 2、從UsernamePasswordToken中獲取username
		String username = upToken.getUsername();
//		char[] password = upToken.getPassword();
		// 3、從資料庫中獲取username對應的記錄
		System.out.println("從資料庫中查詢" + username + "對應的記錄");
		// 4、若使用者不存在丟擲UnknownAccountException異常
		if (UNKNOW.equals(username)) {
			throw new UnknownAccountException("使用者不存在");
		}
		// 5、根據使用者的資訊決定是否丟擲AuthenticationException異常
		if (MONSTER.equals(username)) {
			throw new LockedAccountException("使用者被鎖定");
		}
		// 6、根據使用者情況,構建 AuthenticationInfo 物件並返回
		// 一下資訊是從資料庫中獲取
		// 1)principal:認證的實體資訊,可以是username,也可以是資料表對應的使用者的實體類物件。
		Object principal = username;
		// 2) credentials:密碼
		Object credentials = "123456";
		// 3) realmName:當前realm物件的name,呼叫父類的getName()方法獲取
		String realmName = getName();
		SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);
		return info;
	}

}

如果登陸成功後,之後在進行認證會從緩衝中直接獲取,不會經過Realm,所以若需要重新登陸,需要先登出,再進行登陸。

登出有登出的過濾器,直接配置登出的URL使用即可

<bean id="shiroFilter"
		class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/login.jsp" />
		<property name="successUrl" value="/list.jsp" />
		<property name="unauthorizedUrl" value="/unauthorized.jsp" />
		<!-- 
			配置哪些頁面需要保護
			以及訪問頁面的許可權
			攔截器:(這裡的url支援Ant風格模式)
			1).anon 可以被匿名訪問
			2) .authc 需要認證才能訪問
			3) .logout 登出過濾器
			這裡的url優先匹配
		 -->
		<property name="filterChainDefinitions">
			<value>
				/login.jsp = anon
				/shiro/login = anon
				/shiro/logout = logout
				# everything else requires authentication:
				/** = authc
				
				/list.jsp = anon
			</value>
		</property>
	</bean>