春天安全如何运作

时间:2015-09-23 08:54:18

标签: spring spring-security spring-boot

目的我的问题是理解并清楚地了解安全/会话在Spring中的工作方式。因为我对Spring概念很安静。 我按照本教程来理解

https://spring.io/guides/tutorials/spring-security-and-angular-js/

我的目标是:当用户请求某些资源时(例如/订单/详细信息),如果该请求在标头中没有令牌,则应将其重定向到带有新令牌的登录页面。

    @EnableWebSecurity
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class Config extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.httpBasic().and().authorizeRequests().antMatchers("/*")
                .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);
                        response.sendRedirect("/login");
                    }
                }
                filterChain.doFilter(request, response);
            }
        };
    }

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

上面的代码工作正常但是关于重定向到登录页面,我无法实现它。

请帮助我理解这里的概念。如果您需要更多详情,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:0)

几个星期前,我在你的位置。我不得不将安全性整合到一个弹簧项目中,我对弹簧和安全都是新手。 这就是我所做的。

  1. 浏览了相当多的安全框架
  2. 了解什么是身份模块身份验证模块等。
  3. 我遇到了KeyCloak。我使用的是1.4版
  4. 在本地安装了keycloak并设置了领域
  5. 使用keycloak适配器配置我的springboot应用程序(您可以在keycloak文档中找到所有相关内容)
  6. 就是这样。我能够使用json文件和一个xml配置文件来保护我的Web应用程序和休息api。
  7. 看看它。 我不是安全或春天的专家。只是分享我最近完成的工作。