前言
SpringBoot整合SpringSecurity
总结
分享与交流
安全是项目运行的重要保障,每一个项目在公测之前都会进行严格的认证和授权,阻挡恶意请求,保护项目安全。尽管如此,我们依然有时候能听到某某公司数据泄露,某某公司有重大Bug,所以安全验证就变得越来越重要,是我们在项目中需要考虑的重要因素。
Java领域常用的安全框架有Shiro和SpringBoot。Shiro拥有轻量级的特性从而被广泛使用,但它是第三方框架;Spring Security是一个相对重量级的安全框架,通过名字我们应该也能看到,它是Spring官方的框架,因此在整合方面要占有一定的优势,而且它的功能比Shiro强大些,只要Shiro能实现一般它都能实现。同时SpringBoot提供了自动化配置,做到了开箱即用,因此Spring Security相对来说是Java领域安全框架的最优选择之一。
具体步骤如下
(1)SpringBoot工程如何搭建可以参考SpringBoot框架搭建
(2)引入SpringBoot相关依赖
>
>org.springframework.boot >
>spring-boot-starter-parent >
>2.2.4.RELEASE >
> <!-- lookup parent from repository -->
>
>org.springframework.boot >
>spring-boot-starter-web >
>
>
>org.yaml >
>snakeyaml >
>1.23 >
>
(3)引入SpringSecurity依赖
>
>org.springframework.security >
>spring-security-web >
>5.1.5.RELEASE >
>
>
>org.springframework.security >
>spring-security-config >
>5.1.5.RELEASE >
>
>
>org.springframework.security >
>spring-security-core >
>5.1.5.RELEASE >
>
(4)配置SpringBoot配置文件
#注意每个属性名和属性值之间至少一个空格,注释使用#不是//
spring:
thymeleaf:
prefix: classpath:/templates/ #前缀
suffix: .html #后缀
servlet:
content-type: text/html #在请求中,客户端告诉服务端实际请求的内容
#在响应中,服务端告诉请求端实际响应的内容
encoding: utf-8 #设置编码格式
mode: HTML #校验HTML格式
cache: false #关闭缓存,在开发过程中可立即看到修改后的结果
(5)创建Handler
@Controller
@RequestMapping("security")
public class SecurityController {
@RequestMapping("add")
public String add(){
return "add";
}
@RequestMapping("update")
public String update(){
return "update";
}
@RequestMapping("find")
public String find(){
return "find";
}
@RequestMapping("delete")
public String delete(){
return "delete";
}
}
@RequestMapping("index")
public String index(){
return "index";
}
@RequestMapping("error403")
public String forbidden(){
return "error403";
}
@RequestMapping("/login")
public String login(){
return "login";
}
(6)创建相对应页面
index.html
>
>添加功能>
>修改功能>
>查询功能>
>删除功能>
>
add.html
>
添加功能页面
>
find.html
>
查找功能页面
>
delete.html
>
删除功能页面
>
update.html
>
删除功能页面
>
login.html
<body>
<form action="/login" method="post">
用户名:<input type="text" name="userName"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
</body>
(7)一个简单的mvc就完成了,我们继续实现SpringSecurity
创建SpringSecurityConfig
@Configuration
@EnableWebSecurity //启动SpringSecurity过滤器链
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
//该方法作用是代替配置文件中配置的
/*
用于配置对用户输入密码进行加密并与数据库密码进行配对
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//如果程序报错There is no PasswordEncoder mapped for the id "null",就将该段注释添加下边代码
//或者在MyPasswordEncoder类上加一个@Component注解,使它成为一个Bean
auth.inMemoryAuthentication().withUser("admin").password("123456").authorities("ADMIN_ADD","ADMIN_FIND");//自定义登录用户用户名和密码并赋予一些权限
//上边代码如果使程序报错,就更换以下代码,这个是使用了匿名内部类
//auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("lxy").password("lxy").authorities("ADMIN_ADD","ADMIN_FIND");
}
/*该方法作用是代替配置文件中配置的标签
用来配置拦截资源--拦截什么资源,需要什么样的身份进行访问
自定义spring security拦截器
权限不足的处理
ReadMe功能
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/security/add").hasAuthority("ADMIN_ADD") //ADMIN_ADD身份用户可访问/security/add页面
.antMatchers("/security/find").hasAuthority("ADMIN_FIND")
.antMatchers("/security/update").hasAuthority("ADMIN_UPDATE")
.antMatchers("/security/delete").hasAuthority("ADMIN_DELETE")
.antMatchers("/login").permitAll() //login页面不拦截,任何权限都可访问login页面
.antMatchers("/**") //代表拦截所有的访问请求
.fullyAuthenticated()
.and()
.formLogin() //登陆页面是springSecurity默认的 .formLogin().loginPage("/login")自定义登陆页面 也可设置为 .httpBasic() 登陆页面是弹窗框
.and()
.csrf().disable(); //关闭跨站请求拦截
}
}
(8)创建MyPasswordEncoder
@Component
public class MyPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(charSequence.toString());
}
}
(9)创建错误页面处理类ErrorPageConfig
环境是基于SpringBoot2.0以上版本,以下版本是继承mbeddedServletContainerCustomizer
@Configuration
public class ErrorPageConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage error403Page=new ErrorPage(HttpStatus.FORBIDDEN,"/error403");
registry.addErrorPages(error403Page);
}
}
(10)配置SpringBoot启动类
@SpringBootApplication
@MapperScan("cn.lxy.spring_boot1.repository")
public class SpringBoot1Application {
public static void main(String[] args) {
SpringApplication.run(SpringBoot1Application.class, args);
}
}
(11)测试
访问localhost:8080/index
页面被拦截自动跳转到登陆页面,登陆页面是SpringSecurity默认的登陆页面,也可自定义登陆页面。
账号或密码输入错误,登陆失败
输入上边我们设置好的admin/123456,进入localhost:8080/index
访问添加功能
,查询功能
访问修改功能
,删除功能
以上是SpringBoot整合SpringSecurity的简单使用,SpringSecurity还有很多需要学习的地方。相比于Shiro,Spring Security因其是Spring全家桶中的一员,因此可以和Spring应用无缝衔接,使用起来会更加方便,系统安全是项目运行的重中之重,使用Spring Security进行管理,可以对访问权限进行认证,从而提高项目的安全性。
由于能力有限,博客总结难免有不足,还请大佬们不吝赐教