【问题标题】:Spring security autoauthentication not workingSpring安全自动身份验证不起作用
【发布时间】:2016-09-15 16:57:54
【问题描述】:

我在我的应用程序中使用 Spring Security。当用户想要访问 /privatePages/* 时,会显示登录屏幕以进行身份​​验证。这工作正常。我想有一些东西作为访客访问所以在我的控制器中我做了这样的事情:

Authentication authentication = new UsernamePasswordAuthenticationToken("SAMPLE", "SAMPLE", getAuthority());
//authentication.setAuthenticated(true);
SecurityContextHolder.getContext().setAuthentication(authentication);

public Collection<GrantedAuthority> getAuthority() {
    Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
    GrantedAuthority grantedAuthority = new GrantedAuthority() {
        public String getAuthority() {
            return "ROLE_RequiredRole";
        }
    }; 
    grantedAuthorities.add(grantedAuthority);
    return grantedAuthorities;
}

我可以看到现在执行了身份验证,因为这个表达式给出了 true:

SecurityContextHolder.getContext().getAuthentication().isAuthenticated()

但是我无法访问/privatePages/somePage.jsp。它仍然将我重定向到登录页面。我错过了什么吗?

更新

<http pattern="/privatePages/**" auto-config="true" use-expressions="true" authentication-manager-ref="myManager" create-session="never">
    <session-management invalid-session-url="/privatePages/login" />
    <intercept-url pattern="/privatePages" access="hasRole('RequiredRole')"/>
    <intercept-url pattern="/privatePages/" access="hasRole('RequiredRole')"/>
    <form-login
        login-page="/privatePages/login" . . . . 

【问题讨论】:

  • 好吧,如果您在安全配置中拥有/privatePages/* 的权限,例如:http.authorizeRequests().antMatchers("/privatePages/*").hasAnyRole("whatever);,那么它将对前缀为/privatePages/... 的所有URL 强制执行该规则。相反,在设置需要身份验证的规则之后,您应该使 /privatePages/somePage.jsp 具有 anonymous() 范围。
  • 我希望它无需凭据即可登录。

标签: java spring-mvc spring-security


【解决方案1】:

您正在对 /privatePages/** 制定规则,这意味着该规则将应用于所有前缀为 localhost:8080/privatePages/... 的 URL,如果在该规则中您正在执行某种所需的身份验证,那么它会问无论您在 Controller 中做什么,因为您的请求在到达该阶段之前会通过安全过滤器。

在您的 SecurityConfig 中尝试执行以下操作:

<http auto-config="true">
    <intercept-url pattern="/privatePages" access="ROLE_RequredRole" />
    <intercept-url pattern="/privatePages/somePage.jsp" access="ROLE_ANONYMOUS" />  
 </http>

这里我们使用ROLE_ANONYMOUS,这意味着它的角色不需要任何身份验证。请参阅here 了解更多信息。

【讨论】:

  • 我照你说的做了。它在不使用 ROLE_ANONYMOUS 的情况下工作。我只需要删除/privatePages/**
  • @NoahMartin 是的,所以正如我之前想说的那样,在路径前面有 ** 将强制之后的所有路径也包含在同一规则中。
猜你喜欢
  • 2015-12-16
  • 2017-08-29
  • 2011-05-04
  • 2019-07-18
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2019-01-27
相关资源
最近更新 更多