在ch01的基礎(chǔ)上萎羔,增加自定義用戶登錄界面。Spring Security增加自定義用戶界面非常容易碳默,只需要簡單配置即可完成外驱。
修改SecurityConfiguration.configure(HttpSecurity http)方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/assets/**").permitAll()
.antMatchers("/**").hasRole("USER")
.and().formLogin().loginPage("/login.jsp").permitAll().loginProcessingUrl("/login")
.and().csrf().disable();
}
其中育灸,login.jsp為用戶自定義登錄界面,/login為處理登錄認(rèn)證請求的地址昵宇。
login.jsp的關(guān)鍵代碼為form表單磅崭,基本配置如下:
<!-- 登錄認(rèn)證處理地址 -->
<c:url value="/login" var="loginProcessingUrl"/>
<form class="login-form" action="${loginProcessingUrl}" method="post">
<input type="text" autocomplete="off" placeholder="Username" name="username"/>
<input type="password" autocomplete="off" placeholder="Password" name="password"/>
<button type="submit" class="btn green pull-right"> Login</button>
</form>
自定義登錄界面只需要包含以上form表單內(nèi)容,即可實現(xiàn)Spring Security的保駕護(hù)航瓦哎。
Spring Security兩大功能認(rèn)證和授權(quán)
認(rèn)證是驗證操作者是否是其所申請的用戶
授權(quán)是驗證已認(rèn)證的用戶是否具有某種權(quán)限
認(rèn)證的基本流程如圖所示
圖中各個組件都是可以替換的砸喻,特別是AuthenticationProvider有多個實現(xiàn)類,可支持內(nèi)存蒋譬、數(shù)據(jù)庫割岛、LDAP等多種認(rèn)證方式,這是Spring Security可以支持多種認(rèn)證方式的基礎(chǔ)犯助。
通過認(rèn)證后癣漆,Spring Security創(chuàng)建Authentication(可包含了用戶的詳細(xì)信息),并存儲到SecurityContextHolder中剂买。
授權(quán)的基本流程如圖所示
授權(quán)過程是由FilterSecurityInterceptor處理的惠爽,其本身是AbstractAuthenticationProcessingFilter的子類,并將授權(quán)過程交給AccessDecisionManager處理瞬哼。后者包含采用投票機制驗證權(quán)限婚肆,默認(rèn)是用AffirmativeBased,即一票通過坐慰。此外還有 ConsensusBased(多數(shù)票通過)和 UnanimousBased(全票通過)较性。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.and().authorizeRequests().accessDecisionManager(unaninmousBased())//修改為全票通過的授權(quán)方式
}
/**
* Description:聲明全票通過授權(quán)方式
*
* @param
* @return
*
* @Author: 瓦力
* @Date: 2017/7/20 10:13
*/
@Bean
public AccessDecisionManager unaninmousBased() {
RoleVoter roleVoter = new RoleVoter();
AuthenticatedVoter authenticatedVoter = new AuthenticatedVoter();
List<AccessDecisionVoter<? extends Object>> voters = new ArrayList<>();
voters.add(roleVoter);
voters.add(authenticatedVoter);
UnanimousBased unanimousBased = new UnanimousBased(voters);
return unanimousBased;
}
關(guān)于授權(quán)SpringEl表達(dá)式,在隨后的章節(jié)講解
注銷/退出
通過提交POST請求到"/logout"實現(xiàn)结胀,退出后頁面自動跳轉(zhuǎn)到登錄界面
<form action="/logout" method="post">
<input type="submit" value="Logout">
</form>
基本流程如圖所示
代碼示例:https://github.com/wexgundam/spring.security/tree/master/ch02