我想在前端构建一个带有干净 Angular 的 Spring Boot 应用程序。我的要求是:
- 应用程序基于浏览器
- 包括登录表单
- 某些页面和其余调用必须受到保护
这些都是非常基本的要求,但我对保护 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/