如何处理 Spring Boot Angular 应用程序安全性

Posted

技术标签:

【中文标题】如何处理 Spring Boot Angular 应用程序安全性【英文标题】:How to deal with Spring Boot Angular application security 【发布时间】:2017-01-13 03:52:28 【问题描述】:

我想在前端构建一个带有干净 Angular 的 Spring Boot 应用程序。我的要求是:

    应用程序是基于浏览器的 包括登录表单 必须保护某些页面和其余调用

这些是非常基本的要求,但我对保护 Web 应用程序的可能性感到迷茫。有什么标准的推荐方法吗?我真的很想按照https://spring.io/guides/tutorials/spring-security-and-angular-js/ 的教程进行操作,但由于混合了几种可能的解决方案而不是描述一种解决方案,这让我很困惑。

感谢您的任何建议。

【问题讨论】:

查看 JHipster 以供参考:jhipster.github.io 【参考方案1】:

在我的情况下我遇到了同样的问题,我没有使用angularjs 进行身份验证,我使用了Thymleaf 所以首先你需要创建一个配置类

 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.builders.WebSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;


   import javax.sql.DataSource ;

   @Configuration
    @EnableWebSecurity
   @EnableGlobalMethodSecurity
   public class SecurityConfig extends WebSecurityConfigurerAdapter 


@Autowired
Securityhandler successHandler ;


//this method to make datasource 
@Autowired  
public void GlobalConfig(AuthenticationManagerBuilder auth,DataSource dataSource) throws Exception 
auth.jdbcAuthentication()


.dataSource(dataSource) 
    .usersByUsernameQuery("SELECT  \"user\" AS principal , \"Password\" AS  credentials , true FROM \"usersss\" WHERE \"user\" =  ? ")
            .authoritiesByUsernameQuery("SELECT  u.\"user\" AS principal , r.role as role  FROM \"UTILISATEUR\" u ,\"Role\" r where u.id_role=r.id_role AND \"user\" = ?  ");


        //this one to ignore security for your ressources 
    @Override
public void configure(WebSecurity web) throws Exception 
    web.ignoring()
    .antMatchers("/bootstrap/**","/css/**");


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

    .csrf().disable()   
    .authorizeRequests()
    .anyRequest()   
        .authenticated()        
            .and()
            .formLogin()
         //this one add to login page 
            .loginPage("/login")
            .permitAll()
            .successHandler(successHandler)
            .and()      
            .logout()
            .invalidateHttpSession(true)
            .logoutUrl("/logout")
            .permitAll();   


 

现在 thymleaf 必须使用 uri /login 解析页面 所以你需要添加一个viewresolver

你必须在下面创建另一个像这样的类

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebMVCconfig extends WebMvcConfigurerAdapter 

@Override
public void addViewControllers(ViewControllerRegistry registry) 
    registry.addViewController("/login").setViewName("login");
    registry.addViewController("/logout").setViewName("login");


 

最后,在您的 html 页面中名为 templates 的文件夹下,您需要像这样在 doctype 中声明 thymleaf

 <html xlmns:th="http://www.thymeleaf.org" xml:lang="fr">

你完成了登录表单

    <form name="form" id="form" class="form-horizontal" th:action="@/login" method="post">

                <div class="input-group">
                    <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
                    <input id="username" type="text" class="form-control" name="username" value="" required="" placeholder="Nom de l'utilisateur"/>                                        
                </div>

                <div class="input-group">
                    <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
                    <input id="password" type="password" class="form-control" name="password" required="" placeholder="Mot de passe"/>
                </div>                                                                  

                        <div  th:if="$param.error" class="alert alert-default ">    
             <i class="glyphicon glyphicon-exclamation-sign"></i>
              <b>  Nom d'utilisateur et mot de passe invalide.</b>

            </div>

                        <div  th:if="$param.logout" class="alert alert-default ">    
              <i class="glyphicon glyphicon-exclamation-sign"></i>
              <b>  Vous venez de déconnecter</b>

            </div>
                <div class="form-group">
                    <!-- Button -->
                    <div class="col-sm-12 controls">
                        <button type="submit" href="#" class="btn btn-success pull-right"><i class="glyphicon glyphicon-log-in"></i> Connéxion</button>                          
                    </div>


                </div>

            </form>     

现在 spring security 提供了很多特性,比如现在保护 web 服务,如果你想在你的应用程序中使用 angularjs,你必须添加会话,如果你明白我想告诉你什么,这个解决方案将在每个 url 中提供一个登录页面你输入一次设置登录你必须用angularJs做另一个前端安全所以多个不同角色的用户不能通过更改urls来访问权限

【讨论】:

我不确定我是否完全理解您的答案,但我想我会使用 thymeleaf + spring security 并将 Angular 与此设置集成。谢谢

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

Spring Boot 如何处理可抛出对象

Spring Boot 如何处理 Hibernate 会话?

如何处理 Spring Boot 重定向到 /error?

在 Spring Boot 中验证 JWT 时如何处理 InvalidSignatureException?

如何处理 Spring Boot、AngularJS 应用程序中的 CORS 错误?

跨域在Spring Boot中如何处理