Spring Boot 应用程序中跨平台的 Spring 安全性

Posted

技术标签:

【中文标题】Spring Boot 应用程序中跨平台的 Spring 安全性【英文标题】:Spring security on cross platform in Spring boot application 【发布时间】:2015-10-10 08:55:26 【问题描述】:

如何在跨平台上配置 spring 安全性,例如我有两个应用程序,一个是服务器端,我正在执行所有 java 代码和 spring 安全部分,另一个客户端,所有 angular js 和 html 文件都存在。

我想将客户端的自定义登录页面与 Spring 安全性集成,我该如何实现,以下是我的 Spring 安全性代码。

   public class AppSecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 

        http
                .authorizeRequests()
                .antMatchers("/index.html", "/assests/**", "/app/**",
                        "/**/*.js", "/**/*.css", "/**/*.jpg", "/**/*.png",
                        "/**/*.jpg", "/**/*.gif", "#/index.html", "/home",).permitAll()
                .anyRequest().authenticated()
            .and().formLogin()
          .loginPage("/login").failureUrl("/login?error")
            .usernameParameter("username")
            .passwordParameter("password")
          .and()
          .addFilterBefore(new AppCORSFilter(), ChannelProcessingFilter.class)
                .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class)
                .csrf().disable();   


这是我的 CORS 过滤器。

public class AppCORSFilter implements Filter 

    private static final String ALLOWED_ORIGINS = "*";
    private static final String ALLOWED_HTTP_HEADERS = "accept, x-requested-with, access-control-allow-origin,Content-Type,authorization";
    private static final String ALLOWED_HTTP_METHODS = "POST,GET,PUT,OPTIONS,DELETE";

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) res;

        //String headerValue = request.getHeaders("Access-Control-Request-Headers"); 
        response.setHeader("Access-Control-Allow-Origin", ALLOWED_ORIGINS);
        response.setHeader("Access-Control-Allow-Methods", ALLOWED_HTTP_METHODS);
        response.setHeader("Access-Control-Allow-Headers", ALLOWED_HTTP_HEADERS);
        response.setHeader("Access-Control-Max-Age", "3600");

        HttpServletRequest request = (HttpServletRequest) req;

        if (request.getMethod().equals("OPTIONS")) 
            try 
                response.getWriter().print("OK");
                response.getWriter().flush();
             catch (IOException e) 
                e.printStackTrace();
            
         else 
            chain.doFilter(req, res);
        
    

    public void init(FilterConfig filterConfig) 
    

    public void destroy() 
    

【问题讨论】:

【参考方案1】:

您可以使用 Redis 在您的服务之间共享安全会话。阅读this 文档。您也可以从 this link 找到它的示例。

【讨论】:

谢谢@furkan3ayaktar 非常感谢您的回复,除了 Redis 服务器还有其他方法吗? 可能有很多可用的选项,但我使用了 Redis 和 oAuth2 解决方案。如果您不想使用 redis 服务器,也许您可​​以在您的应用程序中使用 spring 的 oAuth2 支持。但是,它可能比 Redis 解决方案更复杂。 是的,oAuth2 看起来很复杂,感谢您的回复。

以上是关于Spring Boot 应用程序中跨平台的 Spring 安全性的主要内容,如果未能解决你的问题,请参考以下文章

为啥选择Spring Boot作为微服务的入门级微框架

Spring Boot – Jetty配置

Spring boot快速入门

如何利用Spring Boot框架开发一个全球化的应用程序

滴滴将裁员15%涉及员工超2000人;Spring Boot 2.1.3 发布……

Spring Boot 学习例子