如何处理 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 如何处理 Hibernate 会话?
在 Spring Boot 中验证 JWT 时如何处理 InvalidSignatureException?