前面介绍过,Spring Boot使用JWT来实现令牌验证。事实上,Spring Boot有一个完整的安全认证框架:Spring Security。接下来介绍如何集成安全性实现安全验证。
一.安全简介
对于一个安全企业来说非常重要,必要的安全认证阻断了企业外部的异常访问,保证了企业内部数据的安全。
目前,数据安全问题越来越受到业内公司的重视。数据泄露很大一部分是由非正常的权限访问引起的,因此使用合适的安全框架来保护企业服务的安全是非常迫切的。在Java领域,Spring Security无疑是最好的选择之一。
Spring Security是Spring家族中的安全管理框架,可以为基于Spring的企业应用系统提供声明式的安全访问控制解决方案。它提供了一套可在Spring应用系统中灵活配置的组件,充分利用Spring的IoC、DI、AOP等特性,为应用系统提供声明式安全访问控制功能,减少了企业系统安全控制编写大量重复代码的工作。
第二,Spring Boot对安全的支持
虽然在Spring Boot出现之前,Spring Security已经发展了很多年,但是并没有得到广泛的应用。安全管理领域一直是Shiro的天下。与Shiro相比,将Spring Security集成到项目中比较麻烦,所以Spring Security虽然比Shiro强,但不如Shiro普及。
随着Spring Boot的出现,Spring Boot为Spring Security提供了自动配置方案,可以零配置使用。这让春安焕发了青春。
Spring Boot提供了集成了Spring安全的组件包
Spring-Boot-Starter-Security,方便我们在Spring Boot项目中使用Spring安全进行权限控制。
第三,集成安全性
在Spring Boot项目中集成Spring Boot安全性非常简单,只需在项目中添加Spring Boot安全性的依赖项。以下示例演示了Spring Boot基本安全性的登录验证。
1.添加依赖关系
Spring Boot提供了集成了Spring安全的组件包
Spring-Boot-Starter-Security,方便我们在Spring Boot项目中使用Spring安全。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>
除了引入安全组件,我们还添加了Web和百里香组件,因为我们想要验证Web系统的权限。
2.配置登录用户名和密码。
用户名和密码在application.properties中配置..
# securityspring.security.user.name=adminspring.security.user.password=admin
管理员的用户名和密码被添加到application.properties配置文件中。
3.添加控制器
创建一个SecurityController类,并在该类中添加一个页面入口。
@Controllerpublic class SecurityController { @RequestMapping("/") public String index() { return "index"; }}
4.创建前端页面
在资源/模板目录中创建一个页面index.html。该页面是需要权限控制的特定页面。只有登录才能进入这个页面。
<!DOCTYPE html><html xmlns="http://***.w3.org/1999/xhtml" xmlns:th="http://***.thymeleaf.org"><body><h1>Hello</h1><p>我是登录后才可以看的页面</p></body></html>
5.测试验证
配置完成后重启项目,访问地址:http://localhost:8080/,页面会自动弹出一个登录框,如下图所示。
系统自动跳转到Spring Security的默认登录页面,输入之前配置的用户名和密码即可登录系统。登录页面如下图所示。
通过上面的例子,我们可以看到Spring Security自动保护所有访问请求,实现页面权限控制。
四。登录验证
前面已经演示了在Spring Boot项目中集成Spring Security可以实现简单的登录验证功能。在实际项目使用过程中,有些功能页面可能不需要登录验证,而有些功能页面需要登录验证后才能访问。下面完整的示例程序演示了如何实现安全的登录认证。
1.创建页面content.html。
首先创建一个content.html页面。该页面只能由登录用户查看,否则会跳转到登录页面,只有成功登录后才能访问。示例代码如下:
<!DOCTYPE html><html xmlns="http://***.w3.org/1999/xhtml" xmlns:th="http://***.thymeleaf.org"><body><h1>content</h1><p>我是登录后才可以看的页面</p><form method="post" action="/logout"> <button type="submit">退出</button></form></body></html>
在上面的例子中,我们看到退出请求使用post,因为安全退出请求默认只支持post。
2.修改index.html页面
修改之前的index.html页面并添加一个登录按钮。
<p>点击 <a th:href="@{/content}">这里</a>进入管理页面</p>
上例中,索引页属于公共页,没有权限验证。从索引页面进入内容页面时,需要进行登录验证。
3.修改控制器控制器
修改以前的SecurityController控制器并添加内容页的路由地址。示例代码如下:
@RequestMapping("/")public String index() { return "index";} @RequestMapping("/content")public String content() { return "content";}
4.创建SecurityConfig类
创建安全性的配置文件SecurityConfig类,该类继承自
WebSecurityConfigureAdapter,现在可以自定义权限验证配置。示例代码如下:
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .permitAll() .and() .logout() .permitAll() .and() .csrf() .ignoringAntMatchers("/logout"); }}
在上面的示例程序中,可以直接访问SecurityConfig类中配置的index.html,但是content.html只有登录后才能查看,如果没有登录,会自动跳转到登录页面。
@EnableWebSecurity:开启 Spring Security 权限控制和认证功能。antMatchers(“/”, “/home”).permitAll():配置不用登录可以访问的请求。anyRequest().authenticated():表示其他的请求都必须有权限认证。formLogin():定制登录信息。loginPage(“/login”):自定义登录地址,若注释掉,则使用默认登录页面。logout():退出功能,Spring Security自动监控了/logout。ignoringAntMatchers(“/logout”):Spring Security 默认启用了同源请求控制,在这里选择忽略退出请求的同源限制。
5.测试验证
修改后,重启项目。访问地址http://localhost:8080/可以看到索引页面的内容。当你点击链接跳转到内容页面时,你会自动跳转到登录页面。登录成功后会自动跳转到
http://localhost:8080/content。点击内容页面的“退出”按钮,您将退出登录状态,跳转到登录页面,并提示您已经登录。
登录、退出、请求受限页面退出并跳转到登录页面是常见的安全控制案例,也是账号系统的基本安全保障。
本文来自无言温柔天然对象投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/489506.html