ch14:異常處理與認(rèn)證事件處理

Spring Security異常處理

Spring Security在Filter chain中使用ExceptionTranslationFilter檢查并處理在認(rèn)證和授權(quán)過程中拋出的異常。該Filter支持處理或者分發(fā)三種常規(guī)異常行為:

  1. 未認(rèn)證拋出的AuthenticationException继效,定向到用戶登錄界面
  2. 未授權(quán)拋出的AccessDeniedException脾还,定向到403響應(yīng)
  3. 其它情況下拋出的異常弯洗,定向到error響應(yīng)
    具體過程如圖:


    Paste_Image.png

ExceptionTranslationFilter攔截AuthenticationException新锈,并通過AuthenticationEntryPoint完成一下步處理谨敛。如果是基于form的認(rèn)證柿估,LoginUrlAuthenticationEntryPoint負(fù)責(zé)將用戶定向到登錄頁面跳夭。如果是其它認(rèn)證方式,需要實現(xiàn)該接口烈炭,確保未認(rèn)證時能重定向到指定的地址溶锭。

ExceptionTranslationFilter通過AccessDeniedHandler處理AccessDeniedException。如果配置了errorPage符隙,AccessDeniedHandler將異常轉(zhuǎn)發(fā)到errorPage,否則使用容器默認(rèn)的HTTP403頁面垫毙。在之前的幾節(jié)霹疫,我們處理未授權(quán)時,Spring Security默認(rèn)使用容器的HTTP403頁面综芥。

通過修改配置可以設(shè)置自定義AccessDenied處理界面
1 修改WebSecurityConfigurerAdapter

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/assets/**").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/error").permitAll()
                .antMatchers("/**").hasRole("USER")
                .and().formLogin().loginPage("/login.jsp").permitAll().loginProcessingUrl("/login")
                .and().logout().permitAll()
                //配置未授權(quán)處理地址
                .and().exceptionHandling().accessDeniedPage("/accessDenied")
                .and().rememberMe().tokenRepository(persistentTokenRepository())
                .and().csrf().disable();
    }

2 創(chuàng)建Controll處理自定義/accessDenied請求

/**
 * 登錄丽蝎、注銷、未授權(quán)異常處理
 *
 * Created by Administrator on 2017/8/1.
 */
@Controller
@RequestMapping("/")
public class LoginLogoutController {
    @RequestMapping(value = "/accessDenied", method = RequestMethod.GET)
    public ModelAndView accessDenied(HttpServletRequest request) {
        ModelAndView modelAndView = new ModelAndView();
        AccessDeniedException exception = (AccessDeniedException) request.getAttribute(WebAttributes.ACCESS_DENIED_403);
        modelAndView.getModelMap().addAttribute("errorDetails", exception.getMessage());
        StringWriter stringWriter = new StringWriter();
        exception.printStackTrace(new PrintWriter(stringWriter));
        modelAndView.getModelMap().addAttribute("errorTrace", stringWriter.toString());
        modelAndView.setViewName("accessDenied");
        return modelAndView;
    }
}

3 AccessDeniedException界面/WEB-INF/views/accessDenied.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2017/8/1
  Time: 14:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Access Denied</title>
</head>
<body>
    <h1>Access Denied</h1>
    <p>
        Access to the specified resource has bean denied for the following reason:<strong>${errorDetails}</strong>
    </p>
    <em>Error Details(for Support Purpose only:)</em>
    <br />
    <blockquote>
        <pre>${errorTrace}</pre>
    </blockquote>
</body>
</html>

啟動服務(wù)器膀藐,用戶名為User登錄系統(tǒng)屠阻,點(diǎn)擊未授權(quán)服務(wù),系統(tǒng)將跳轉(zhuǎn)到自定義的報錯界面额各。

Spring Security事件

Spring Security基于Spring的事件發(fā)布機(jī)制處理認(rèn)證時發(fā)生的事件国觉。認(rèn)證事件實現(xiàn)了ApplicationEvent接口。通過獲取這些事件我們可以記錄認(rèn)證領(lǐng)域的行為虾啦。
事件是典型的訂閱-發(fā)布模式麻诀,通知訂閱者由Spring扶著痕寓。發(fā)布流程如下:


Paste_Image.png

這里我們簡單實現(xiàn)一下認(rèn)證過程的事件跟蹤。
1 配置AuthenticationEventPublisher蝇闭。修改WebSecurityConfigurerAdapter

  @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .authenticationEventPublisher(authenticationEventPublisher())//注入事件發(fā)布者
                .jdbcAuthentication()
                .passwordEncoder(passwordEncoder())//啟用密碼加密功能
                .dataSource(dataSource);
    }

    /**
     * Description:認(rèn)證事件發(fā)布器
     *
     * @Author: 瓦力
     * @Date: 2017/8/1 16:55
     */
    @Bean
    public AuthenticationEventPublisher authenticationEventPublisher() {
        return new DefaultAuthenticationEventPublisher();
    }

2 創(chuàng)建認(rèn)證事件處理器

/**
 * 接收Spring Security發(fā)布的AbstractAuthenticationEvent
 *
 * Created by Administrator on 2017/8/1.
 */
@Component
public class AuthenticationEventListener implements ApplicationListener<AbstractAuthenticationEvent> {
    @Override
    public void onApplicationEvent(AbstractAuthenticationEvent event) {
        System.out.println("Receive event of type:" + event.getClass().getName() + ":" + event.toString());
    }
}

啟動服務(wù)呻率,登錄用戶,注銷用戶呻引,控制臺就會輸出認(rèn)證過程中發(fā)生的各種事件信息礼仗。

代碼示例:https://github.com/wexgundam/spring.security/tree/master/ch14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逻悠,隨后出現(xiàn)的幾起案子元践,更是在濱河造成了極大的恐慌,老刑警劉巖蹂风,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卢厂,死亡現(xiàn)場離奇詭異,居然都是意外死亡惠啄,警方通過查閱死者的電腦和手機(jī)慎恒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撵渡,“玉大人融柬,你說我怎么就攤上這事∏骶啵” “怎么了粒氧?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長节腐。 經(jīng)常有香客問我外盯,道長,這世上最難降的妖魔是什么翼雀? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任饱苟,我火速辦了婚禮,結(jié)果婚禮上狼渊,老公的妹妹穿的比我還像新娘箱熬。我一直安慰自己,他們只是感情好狈邑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布城须。 她就那樣靜靜地躺著,像睡著了一般米苹。 火紅的嫁衣襯著肌膚如雪糕伐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天驱入,我揣著相機(jī)與錄音赤炒,去河邊找鬼氯析。 笑死,一個胖子當(dāng)著我的面吹牛莺褒,可吹牛的內(nèi)容都是我干的掩缓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼遵岩,長吁一口氣:“原來是場噩夢啊……” “哼你辣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尘执,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤舍哄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后誊锭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體表悬,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年丧靡,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟆沫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡温治,死狀恐怖饭庞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熬荆,我是刑警寧澤舟山,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站卤恳,受9級特大地震影響累盗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜突琳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一幅骄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧本今,春花似錦、人聲如沸主巍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孕索。三九已至逛艰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搞旭,已是汗流浹背散怖。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工菇绵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镇眷。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓咬最,卻偏偏與公主長得像,于是被迫代替她去往敵國和親欠动。 傳聞我的和親對象是個殘疾皇子永乌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容