[英]How to logout successfully with spring security using FreeMarker
我尝试从应用程序中注销时遇到问题,当我按应用程序中的注销按钮时,它再次显示登录页面,但是如果在浏览器中的搜索栏中进行写操作,则可以直接进入应用程序中的任何页面而无需要再次登录,似乎当我按注销链接时,我根本没有注销。
这是我的依赖
<!-- SPRING SECURITY -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
我将FreeMarkes用作模板引擎,并且使用此表达式可以访问Jsp安全标签。
<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />
这是我的登录控制器:
@Controller
@RequestMapping("/login/")
public class LoginControl {
@RequestMapping (value = "login", method = RequestMethod.GET)
public String login (Model model, @RequestParam(value = "logout", required = false) String logout)
{
System.out.println(" logut is " + logout);
return "/login/login";
}
}
这是我的春季安全配置,我使用的是Java配置,没有XML
@Configuration
@EnableWebMvcSecurity
public class SeguridadConfiguracion extends WebSecurityConfigurerAdapter {
@Autowired
private AutrProvider aut;
@Override
protected void configure( HttpSecurity http ) throws Exception
{
http
.authenticationProvider(autenticador)
.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.antMatchers("/css/**").permitAll()
.antMatchers("/js/**").permitAll()
.antMatchers("/img/**").permitAll()
.antMatchers("/sound/**").permitAll()
.antMatchers("/fonts/**").permitAll()
.antMatchers("/ajax/**").permitAll()
.antMatchers("/php/**").permitAll()
.antMatchers("/xml/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login/login")
.permitAll()
.and()
.logout().logoutSuccessUrl("/login/login?logout")
.permitAll()
.and()
.csrf().disable();
}
}
和我的AutProvider类
@Component
public class AutProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String name = null;
String password = null;
Authentication auth = null;
try {
name = authentication.getName();
password = authentication.getCredentials().toString();
if (name.equals("admin@admin.com") && password.equals("password")) {
List<GrantedAuthority> grantedAuths = new ArrayList<>();
grantedAuths.add(new SimpleGrantedAuthority("PERM_DELETE"));
auth = new UsernamePasswordAuthenticationToken(name, password, grantedAuths);
}
} catch (AuthenticationException e) {
e.printStackTrace();
throw e;
}
return auth;
}
这就是我如何在页面中调用注销链接
<div id="logout" class="btn-header transparent pull-right">
<span> <a href="../login/login?logout.html" title="Sign Out" data-action="userLogout" data-logout-msg="You can improve your security further after logging out by closing this opened browser"><i class="fa fa-sign-out"></i></a> </span>
</div>
我试图改变href="../login/login?logout.html"
到href="../j_spring_security_logout
”`但是我这样做时,它说找不到404。
编辑:
我认为真正的问题在于以下几行:
在我的春季安全性配置课程中:
.and()
.logout().logoutSuccessUrl("/login/login?logout")
.permitAll()
我的登录控制器的这一部分:
@RequestMapping (value = "login", method = RequestMethod.GET)
public String login (Model model, @RequestParam(value = "logout", required = false) String logout)
{
System.out.println(" logut is " + logout);
return "/login/login";
}
这是我称为注销的页面中的这一部分:
<a href="../login/login?logout.html"
我对此链接感到非常困惑: j_spring_security_logout
如果我没有为该路径映射任何控制器,为什么应该将其放在我的href中,请阅读该链接是某种虚拟链接,该虚拟链接已与我放入的路径映射我的春季安全配置类,但我不确定,但我相信该链接已经定义了某种功能,例如关闭会话或清除我的crfs tokken(如果以后要使用一个(因为我的里面没有一个)立即申请))。
编辑2:
我更改了春季安全配置课程以执行此操作
.formLogin()
.loginPage("/login/login")
.permitAll()
.and()
.logout()
.permitAll()
.logoutUrl("/login/logoutPage")
.logoutSuccessUrl("/login/login")
.and()
.csrf().disable();
然后,我创建了一个新的注销页面,该页面与登录页面相同(是副本,但文件名不同),并且创建了新的控制器方法来映射此新页面。 因为当我尝试使用此控制器时:
@RequestMapping (value = "login", method = RequestMethod.GET)
public String login (Model model, @RequestParam(value = "logout", required = false) String logout)
{
System.out.println(" logut is " + logout);
return "/login/login";
}
与此href="../login/login?logout.html"
显示给我登录页面,但我根本没有注销,但是当我在新页面上执行该操作时,我将其注销可以,但是有没有一种方法可以使用与我尝试使用的页面相同的页面。
还有logoutUrl()
和logoutSuccessUrl()
什么区别
如何使当前会话无效? 像这样:
public String logout(HttpSession session) {
session.invalidate();
....
}
我对此链接感到非常困惑:j_spring_security_logout如果我没有为该路径映射任何控制器,为什么应该将其放在我的href中,请阅读该链接是某种虚拟链接,该虚拟链接已与我放入的路径映射我的春季安全配置类,但我不确定,但我相信该链接已经定义了某种功能,例如关闭会话或清除我的crfs tokken(如果以后要使用一个(因为我的里面没有一个)立即申请))。
为了使您更加清楚:
org.springframework.security.web.authentication.logout.LogoutFilter
引入每个请求。 Spring框架和您都未实现任何用于处理注销的控制器。 <a href="${pageContext.request.contextPath}/logout" ../>
。 单击此URL将使会话无效,并重定向(而不是转发)到注销成功URL(logoutSuccessUrl(“ / logout.html”)。 .logout().deleteCookies(“ remove”)。logoutUrl(“ / custom-logout”)。logoutSuccessUrl(“ / logout-success”);
希望这有助于您的理解并帮助您解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.