spring shiro的過濾器配置
<!-- 基于Form表單的身份驗證過濾器 -->
<bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<property name="usernameParam" value="username"/>
<property name="passwordParam" value="password"/>
<property name="rememberMeParam" value="rememberMe"/>
<property name="loginUrl" value="/login"/>
</bean>
<!-- Shiro的Web過濾器 此id名稱應該與web.xml文件中的配置名稱一致-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/login"/>
<property name="filters">
<util:map>
<entry key="authc" value-ref="formAuthenticationFilter"/>
<entry key="sysUser" value-ref="sysUserFilter"/>
<!--添加ssl支持-->
<!--<entry key="ssl" value-ref="sslFilter"/>-->
<!-- 結(jié)束ssl支持-->
</util:map>
</property>
<property name="filterChainDefinitions">
<value>
/login=authc
/logout=logout
/authenticated=authc
/**=user,sysUser
</value>
</property>
</bean>
登陸的action
@RequestMapping(value = "/login" )
public String showLoginForm(HttpServletRequest req, Model model) {
String exceptionClassName = (String)req.getAttribute("shiroLoginFailure");
String error = null;
if(UnknownAccountException.class.getName().equals(exceptionClassName)) {
error = "用戶名/密碼錯誤";
} else if(IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
error = "用戶名/密碼錯誤";
} else if(exceptionClassName != null) {
error = "其他錯誤:" + exceptionClassName;
}
model.addAttribute("error", error);
return "login";
}
登陸表單頁面
<html>
<head>
<title>登錄</title>
<style>.error{color:red;}</style>
</head>
<body>
<div class="error">${error}</div>
<form action="" method="post">
用戶名:<input type="text" name="username" value="<shiro:principal/>"><br/>
密碼:<input type="password" name="password"><br/>
自動登錄:<input type="checkbox" name="rememberMe" value="true"><br/>
<input type="submit" value="登錄">
</form>
</body>
</html>
兩個情況說明:
- 在瀏覽器中輸入地址: localhost:8080/ 的流程
配置文件中/**=user,sysUser揖膜,所以先走 UserFilter 這個過濾器
此時用戶未登陸孟岛,在UserFilter 過濾器中建芙,會重定向到 /login,進入登陸頁面瘪贱,并且記住此時的請求地址 "/"
在頁面中輸入用戶名密碼稻艰,此時action=""是這樣的涯鲁,當點擊提交按鈕時同木,表單會提交到 當前的地址 "/login",post方法而且?guī)е脩裘兔艽a
/login=authc 因為這個配置黍氮,會經(jīng)過FormAuthenticationFilter這個過濾器唐含,該類會判斷此請求是否為登陸請求,如果是沫浆,則走登陸流程(subject.login(xxx))捷枯,登陸成功后, 會重現(xiàn)跳轉(zhuǎn)到 上次保存的請求地址 ”/"
- 在瀏覽器中輸入地址:localhost:8080/login
/login=authc 因為這個配置专执,會經(jīng)過FormAuthenticationFilter這個過濾器淮捆,
該類會判斷此請求是否為登陸請求,如果是,則走登陸流程(subject.login(xxx))争剿,
登陸成功后已艰, 因為沒有其他的求情痊末,成功后會直接跳轉(zhuǎn)到successUrl蚕苇;如果沒有配置,默認是”/"
看一下FormAuthenticationFilter的繼承關(guān)系
重要的方法
public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}
先判斷是否已經(jīng)授權(quán)凿叠,如果沒有再判斷是否是登陸請求