1. 程式人生 > >整合shiro時,登入請求無法捕捉UnknownAccountException

整合shiro時,登入請求無法捕捉UnknownAccountException

程式碼寫累了,關於整合shiro,寫個文章記錄下一個簡單但是困擾了我好久的問題:無論登陸時包什麼異常,在controll中獲取的都是異常的父類AuthenticationException。

框架使用ssm,在整合shiro時,自定義一個realm,命名為MyAuthorRealm,程式碼和網上大部分一樣,主要是配置部分出了問題,老配置如下:

(貼了半天程式碼。。。。這個編輯器也是夠了)

<!-- Shiro安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
	<property name="realms">
		<list>
			<ref bean="jdbcRealm"/>
			<ref bean="myAuthorRealm"/>
		</list>
	</property>
	<property name="cacheManager" ref="cacheManager"></property>
</bean>

這裡配置了兩個realm,按照順序,shiro驗證登入使用者的時候會先走jdbcRealm,這時如果在MyAuthorRealm丟擲throw new UnknownAccountException("使用者不存在");,當捕獲時卻變成了它的父類AuthenticationException,在這裡既然自定義了驗證類MyAuthorRealm,就無需再用jdbcRealm了,去掉它,就可以正常捕獲異常了:

try {
	subject.login(token);
} catch (UnknownAccountException ex) {
	map.put("message","使用者名稱沒有找到");
	return new ModelAndView("/admin/login",map);
} catch (IncorrectCredentialsException ex) {
	map.put("message","使用者名稱密碼不匹配");
	return new ModelAndView("/admin/login",map);
}catch (AuthenticationException e) {
	map.put("message","其他的登入錯誤");
	return new ModelAndView("/admin/login",map);
}