上一篇:Spring Security 4 自定义登录表单 注解和XML例子
下一篇:Spring
Security 4 安全视图片段 使用标签(Spring Security 标签)
原文地址:http://websystique.com/spring-security/spring-security-4-logout-example/
【已翻译文章,点击分类里面的spring security 4 】
【 翻译by 明明如月 QQ 605283073】
本文展示Spring Security程序退出用户,同时对浏览器返回按钮也有效。
当然在视图中,你应该提供一个退出链接来退出。类似如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Admin page</title> </head> <body> Dear <strong>${user}</strong>, Welcome to Admin Page. <a href="<c:url value="/logout" />">Logout</a> </body> </html>
你仅仅需要在你的controller中映射 /logou 链接
@RequestMapping(value="/logout", method = RequestMethod.GET) public String logoutPage (HttpServletRequest request, HttpServletResponse response) { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null){ new SecurityContextLogoutHandler().logout(request, response, auth); } return "redirect:/login?logout";//You can redirect wherever you want, but generally it's a good practice to show login screen again. }
这里 首先我们在使用SecurityContextHolder.getContext().getAuthentication() 之前校验该用户是否已经被验证过。
然后调用SecurityContextLogoutHandler().logout(request, response, auth)
来退出
logout
调用流程:
1
将 HTTP Session 作废,解绑其绑定的所有对象。
2
从SecurityContext移除Authentication 防止并发请求的问题。
3
显式地清楚当前线程的上下文里的值。
在应用的其他地方不再需要处理 退出。
注意:你甚至都不需要在你的spring多添加任何配置(不管是基于注解还是基于xml)。
package com.websystique.springsecurity.configuration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("USER"); auth.inMemoryAuthentication().withUser("admin").password("root123").roles("ADMIN"); auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").permitAll() .antMatchers("/admin/**").access("hasRole('ADMIN')") .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") .and().formLogin().loginPage("/login") .usernameParameter("ssoId").passwordParameter("password") .and().exceptionHandling().accessDeniedPage("/Access_Denied"); } }
在上述配置中并没有退出的处理。
上面的 配置对应的xml配置为:
<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd"> <http auto-config="true" > <intercept-url pattern="/" access="hasRole('USER')" /> <intercept-url pattern="/home" access="hasRole('USER')" /> <intercept-url pattern="/admin**" access="hasRole('ADMIN')" /> <intercept-url pattern="/dba**" access="hasRole('ADMIN') and hasRole('DBA')" /> <form-login login-page="/login" username-parameter="ssoId" password-parameter="password" authentication-failure-url="/Access_Denied" /> </http> <authentication-manager > <authentication-provider> <user-service> <user name="bill" password="abc123" authorities="ROLE_USER" /> <user name="admin" password="root123" authorities="ROLE_ADMIN" /> <user name="dba" password="root123" authorities="ROLE_ADMIN,ROLE_DBA" /> </user-service> </authentication-provider> </authentication-manager> </beans:beans>
其他的代码跟本系列文章提到的都是一样的。
部署 & 启动
下载本项目的完整代码。在Servlet 3.0(Tomcat7/8)容器中构建和部署。
打开浏览器输入:http://localhost:8080/SpringSecurityCustomLogoutExample/
再访问 http://localhost:8080/SpringSecurityCustomLogoutExample/admin 将会被转到登录界面
用配置的amind账户登录
点击退出链接
点击 浏览器 后退按钮 仍然会被拦截在登录界面
本文结束。下一篇文章将介绍根据Spring Security 的标签,根据 登录用户的角色来显示或者隐藏 jsp或者view的一部分。
源码下载:http://websystique.com/?smd_process_download=1&download_id=1375