当前位置: 首页 > 知识库问答 >
问题:

Spring Security未在Spring Session启用时重用身份验证数据RedisHttpSession

滕弘新
2023-03-14

我能够通过https://github.com/dsyer/spring-security-angular/blob/master/vanilla/readme.md的示例spring boot Groovy Maven实现成功地运行这个配置。当应用程序代码在Java和Gradle2.3中实现时,它就不起作用了。在这种情况下,OPTIONS响应有一个新的X-Auth-Token。

尝试使用我的java类提供的maven构建,但仍然得到相同的选项401未经授权的响应。所以这不是一个等级问题。

将两个ResourceApplication Groovy类复制到我的Gradle构建中,Angular ui成功地获得选项200,OK。所以Java中的Spring CORS过滤器存在一个问题。

我有java和groovy的Gradle插件,sourceCompatibility和targetCompatibility=1.7

已阻止跨源请求:同一源策略不允许读取http://localhost:9000/上得远程资源.这可以通过将资源移动到同一域或启用CORS来解决。本地主机:9000

@SpringBootApplication
@RestController
@EnableRedisHttpSession
public class AngularDemoApplication {
@RequestMapping("/user")
public Principal user(Principal user) {
  return user;
}

@RequestMapping("/token")
@ResponseBody
public Map<String,String> token(HttpSession session) {
  logger.debug("********** TOKEN *********** = "+session.getId());
  return Collections.singletonMap("token", session.getId());
}

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
      http.httpBasic().and().logout().and().authorizeRequests()
        .antMatchers("/index.html", "/home.html", "/login.html", "/").permitAll()
        .anyRequest().authenticated().and().csrf().csrfTokenRepository(csrfTokenRepository())
        .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class);
  }

  private Filter csrfHeaderFilter() {
        return new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request,
                    HttpServletResponse response, FilterChain filterChain)
                    throws ServletException, IOException {
                CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
                        .getName());
                if (csrf != null) {
                    Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
                    String token = csrf.getToken();
                    if (cookie == null || token != null
                            && !token.equals(cookie.getValue())) {
                        cookie = new Cookie("XSRF-TOKEN", token);
                        cookie.setPath("/");
                        response.addCookie(cookie);
                    }
                }
                filterChain.doFilter(request, response);
            }
        };
    }


  private CsrfTokenRepository csrfTokenRepository() {
      HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
      repository.setHeaderName("X-XSRF-TOKEN");
      return repository;
  }
}

public static void main(String[] args) {
    SpringApplication.run(AngularDemoApplication.class, args);
}

}

@SpringBootApplication
@RestController
@EnableRedisHttpSession
public class ResourceApplication {

@RequestMapping("/")
public Map<String,Object> home() {
      Map<String,Object> model = new HashMap<String,Object>();
      model.put("id", UUID.randomUUID().toString());
      model.put("content", "Hello World");
      return model;
}


@Bean
public HeaderHttpSessionStrategy sessionStrategy() {
    return new HeaderHttpSessionStrategy();
 }

public static void main(String[] args) {
    SpringApplication.run(ResourceApplication.class, args);
}

}

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
class CorsFilter implements Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    HttpServletRequest request = (HttpServletRequest) req;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-auth-token, x-requested-with");
    if (request.getMethod() != "OPTIONS" ) {
        chain.doFilter(req, res);
    } else {
         }

}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub

}

@Override
public void destroy() {
    // TODO Auto-generated method stub

}

Redis服务器密钥:
1)“Spring:Session:Expirations:1427838660000”
2)“Spring:Session:Sessions:80E0C2D2-DAB4-435D-886E-AE28BC8E636F”

请求方法:选项
状态代码:401未授权

请求头:
主机:localhost:9000
用户代理:Mozilla/5.0(Windows NT 6.1;WOW64;RV:36.0)Gecko/20100101 Firefox/36.0
接受:文本/HTML,Application/XHTML+XML,Application/XML;q=0.9,/;q=0.8
接受-语言:en-US,en;q=0.5
接受-编码:gzip,deflate
来源:localhost:8080
访问控制-请求-方法:GET
访问控制-请求-头:x-验证令牌,x-请求-with
连接:保持-活着
r>

响应标头:
access-control-allow-Headers:x-auth-token,x-requested-with
access-control-allow-methods:POST,PUT,GET,OPTIONS,DELETE
access-control-allow-origin:*
access-control-max-age:3600
allow:GET,HEAD,POST,PUT,PUT,DELETE,TRACE,OPTIONS,PATCH
content-lengt:0
日期:Tue,2015年3月31日20:50:26 GMT
服务器:apache-coyote/1.1
strict-transport-security:max-age=31536000;includeSubDomains
www-authenticate:Basic realm=“spring”
x-auth-token:8af7e1f4-e723-4ce6-8d21-54a7b10369f8

Redis服务器密钥:
1)“Spring:Session:Sessions:8AF7E1F4-E723-4CE6-8D21-54A7B10369F8”
2)“Spring:Session:Expirations:1427836860000”
3)“Spring:Sessions:C6A6CC31-EDDC-40DD-99DE-A6E1EECBF519”

共有1个答案

宁侯林
2023-03-14

在Java中“!=”运算符与Groovy不同。要进行字符串对象比较,请使用equals方法。即。

if( !"OPTIONS".equals(request.getMethod()))   
 类似资料:
  • 我正在laravel中创建一个多身份验证系统,其中有两种类型的用户:管理员(由我创建)和用户(使用本地laravel身份验证系统)。 如果我以用户身份登录,当我尝试访问登录页面时,当我已经登录,它会将我重定向回仪表板,但如果我以管理员身份登录,当我再次访问管理员登录页面时,它会让我再次登录,尽管已经作为管理员登录。 以下是我的重定向身份验证类代码: 有人能解释一下发生了什么事吗?

  • 问题内容: 这是我的情况: 一个Web应用程序对许多应用程序执行某种SSO 登录的用户,而不是单击链接,该应用就会向正确的应用发布包含用户信息(名称,pwd [无用],角色)的帖子 我正在其中一个应用程序上实现SpringSecurity以从其功能中受益(会话中的权限,其类提供的方法等) 因此,我需要开发一个 自定义过滤器 -我猜想-能够从请求中检索用户信息,通过自定义 DetailsUserSe

  • 我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无

  • 我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向

  • 我正在开发一个web应用程序与laravel 5.2多身份验证。 这是我的密码。 Auth.php IndexController.php 路线。 我可以成功登录,但无法登录用户数据? 现在它在我的浏览器中返回为null。

  • 我想使用基本身份验证调用keydrope Rest API。为了做到这一点,我尝试了下面的答案,但缺少链接。 我已将客户端访问类型设置为机密,并启用了直接访问授权。 显然,需要在Java适配器配置中指定启用基本身份验证,但我看不出这是如何实现的。文档中提到它是一个JSON文件,听起来像是我将其作为配置添加到Keyclope目录中。 最后,我看到有人提到使用生成的秘密。我可以在选项卡中生成一个秘密,