如何使用FreeMarker成功注销Spring安全性

时间:2015-04-15 20:19:06

标签: java spring spring-mvc login spring-security

我在尝试从我的应用程序注销时遇到问题,当我按下我的应用程序中的注销按钮时,它再次向我显示登录页面,但如果在浏览器的搜索栏中写入,我可以转到我的任何页面应用程序无需再次登录,似乎当我按下注销链接时,我根本不会注销。

这是我的专业依赖

<!-- 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";
}
}

这是我的spring安全配置,我使用的是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找不到。

编辑:

我认为真正的问题在于以下几点:

在我的spring secuirty配置类中:

 .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中,读取该链接是某种映射的虚拟链接我放在我的spring secuirty配置类中的路径,我不确定,但我相信该链接已经定义了某种功能,如关闭我的会话或清除我的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()

之间的区别是什么?

2 个答案:

答案 0 :(得分:1)

如何使当前会话无效? 像这样:

  public String logout(HttpSession session) {
    session.invalidate();
    ....
  } 

答案 1 :(得分:0)

  

我对此链接非常困惑:j_spring_security_logout为什么要这样做   如果我没有任何控制器映射,我把它放在我的href中   路径,读取该链接是某种虚拟链接   用我在spring spring secuirty配置中放置的路径映射   上课,我不确定,但我相信那个链接有某种   已定义的功能,如关闭我的会话或清除我的   crfs tokken(如果我以后想要使用一个(因为我没有一个)   现在申请))。

为了给你一些清晰度:

  1. Spring安全性通过web.xml中定义的安全过滤器链向每个请求引入org.springframework.security.web.authentication.logout.LogoutFilter。 Spring框架都没有实现任何控制器来处理注销。
  2. 您在HttpSecurity对象上调用了logout()。logoutSuccessUrl(&#34; / login / login?logout&#34;)。按照春季安全3.2文档
    • 对于您的配置,默认情况下,URL&#34; / logout&#34;将通过使HTTP会话无效来记录用户,* 所以你需要在你的jsp:<a href="${pageContext.request.contextPath}/logout" ../>中设置这样的注销URL。单击此URL将使会话无效并重定向(而不是转发)到注销成功URL(logoutSuccessUrl(&#34; /logout.html")。
  3. 如果您甚至不想使用&#39;退出&#39;关键字并设置&#39; custom-logout&#39;作为您网址中的关键字。遵循这样的事情。
  4. .logout()。deleteCookies(&#34; remove&#34;)。logoutUrl(&#34; / custom-logout&#34;)。logoutSuccessUrl(&#34; / logout-success&#34;);

    希望这有助于您理解并帮助解决您的问题。