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

标签 angularjs spring spring-security spring-boot

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

  1. 应用程序基于浏览器
  2. 包括登录表单
  3. 某些页面和其余调用必须受到保护

这些都是非常基本的要求,但我对保护 Web 应用程序安全的可能性感到困惑。有什么标准的、推荐的方法吗?我真的尝试遵循 https://spring.io/guides/tutorials/spring-security-and-angular-js/ 的教程但由于混合了几种可能的解决方案而不是描述一个,因此非常令人困惑。

感谢您的任何建议。

最佳答案

我遇到了同样的问题,我没有使用 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");

}
} 

最后在名为 templates 的文件夹下的 html 页面中,您需要在文档类型中声明 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,则必须添加 session ,如果您了解我试图告诉您的内容,则此解决方案将在每个网址中提供登录页面一旦设置登录,您就必须使用 angularJs 进行另一个前端安全性,这样具有不同 Angular 色的多个用户就无法通过更改 url 来访问权限

关于angularjs - 如何处理 Spring Boot Angular 应用程序安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336302/

相关文章:

java - 如何让 Spring 打印出哪些 Spring 配置文件处于 Activity 状态?

java - 用于 Spring 安全的 SpEL : Passing Values from XML to Java based SpEL configuration

angularjs - 光滑的网格包裹在指令( Angular )中,某些选项不起作用(调整大小和拖放列)

滚动后javascript选择的文本位置不正确

angularjs - ui-router 嵌套路由 Controller 未被调用

javascript - FS.Store.GridFS 由变换创建 : false

java - 使用 Hibernate 构建服务层

java - Spring定时任务长时间停止工作

java - 如何使用安全 :authentication tag in Spring? 获取用户名

Spring security 自定义哈希算法