shiro表单认证(系统默认的form认证器)
生活随笔
收集整理的這篇文章主要介紹了
shiro表单认证(系统默认的form认证器)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址:http://blog.csdn.net/zcl_love_wx
注意:此文是基于springMVC框架的,所以關于springMVC的配置這里不說,后面有時間專門寫一個shiro整合spring的文章
1.shiro表單認證流程
2.shiro認證代碼
2.1 頁面代碼
這里的method值必須為post,否則不會執行認證過程而直接執行在spring.xml里配置的loginUrl指定的路徑 <form action="<%=basePath%>login.do" method="post"> username:<input type="text" name="username"><p> password:<input type="password" name="password"> <p>${msg} <input type="submit" value="submit"> </form>2.2 web.xml文件需要添加的代碼
<filter-name>標簽里的過濾器名字,應與spring.xml里配置的過濾器名一致
<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>2.3 控制器代碼
realm 認證不通過時,會將錯誤信息添加到request中,這樣在下面的方法中,可通過shiroLoginFailure這個鍵獲取到錯誤信息的類名。
// 用戶登陸提交 @RequestMapping("/login.do") public String loginsubmit(HttpServletRequest request,Model model)throws Exception {// shiro在認證過程中出現錯誤后將異常類路徑通過request返回String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");if(exceptionClassName!=null){if (UnknownAccountException.class.getName().equals(exceptionClassName)) {System.out.println("賬號不存在");} else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {System.out.println("用戶名/密碼錯誤");} else if("randomCodeError".equals(exceptionClassName)){System.out.println("驗證碼錯誤");} else{System.out.println("未知錯誤");}}return "/login.jsp"; }2.3 自定義realm的代碼
/**** * 自定義Realm * * @author Peter* @date 2016-06-03 * */ public class MyShiroRealm extends AuthorizingRealm { @Overridepublic String getName() {return"customRealm";}// 支持什么類型的token@Overridepublic boolean supports(AuthenticationToken token) {return token instanceof UsernamePasswordToken;}/*** * 獲取授權信息 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) { //省略...... return null; } /*** * 獲取認證信息 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken at) { UsernamePasswordToken token = (UsernamePasswordToken) at; //這里也有用戶名與密碼 // 接收表單的用戶名 String username = (String) at.getPrincipal();if (username != null && !"".equals(username)) { //通過用戶名去數據查回用戶操作//省略......//模擬數據庫查加的用戶名為:"張春玲",密碼為:"123456"if("張春玲".equals(username) && "123456".equals(token.getUsername())){}else{throw new IncorrectCredentialsException(); //拋出密碼錯誤異常 }} else{throw new UnknownAccountException(); //沒有該用戶異常} return null; } }2.4 spring.xml需要添加的代碼
注意,loginUrl指定的路徑必須是authc(即認證通過才可訪問),否則請求不會被realm攔截而直接執行了loginUrl指定的路徑
<!-- Shiro的Web過濾器 --><!-- loginUrl認證提交地址,如果沒有認證將會請求此地址進行認證,請求此地址將由formAuthenticationFilter進行表單認證 --><!-- successUrl可配置登錄成功后的跳轉路徑,如果不配的話,就自動跳轉到請求登錄時的路徑,即上一個路徑。所以建議不配 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager"/><property name="loginUrl" value="/login.do"/><property name="unauthorizedUrl" value="/refuse.jsp"/><!-- 過慮器鏈定義,從上向下順序執行,一般將/**放在最下邊 --><property name="filterChainDefinitions"><value>/login.do = authc<!-- 登錄的地址必須是authc,不然也不會執行realm而直接執行登錄路徑了 --> /** = authc <!-- user表示身份認證通過或通過記住我認證通過的可以訪問 --></value></property> </bean><!-- 注入 --><bean id="myShiroRealm" class="com.mvc.realm.MyShiroRealm"> </bean> <!-- 安全管理器 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myShiroRealm"></property> </bean>總結
以上是生活随笔為你收集整理的shiro表单认证(系统默认的form认证器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String直接赋字符串和new Str
- 下一篇: shiro表单登录认证及退出(自定义fo