当前位置:   article > 正文

SpringBoot集成Spring Security详细配置_springboot配置springsecurity

springboot配置springsecurity

一、前言

Spring Security 和 Apache Shiro 都是安全框架,为Java应用程序提供身份认证和授权。

二者区别

  1. Spring Security:量级安全框架
  2. Apache Shiro:量级安全框架

关于shiro的权限认证与授权可参考小编的另外一篇文章 : SpringBoot集成Shiro 实现动态加载权限

https://blog.csdn.net/qq_38225558/article/details/101616759

二、SpringBoot集成Spring Security入门体验

基本环境 : springboot 2.1.8

1、引入Spring Security依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>

2、新建一个controller测试访问

  1. @RestController
  2. public class IndexController {
  3. @GetMapping("/index")
  4. public String index() {
  5. return "Hello World ~";
  6. }
  7. }

3、运行项目访问 http://127.0.0.1:8080/index

温馨小提示:在不进行任何配置的情况下,Spring Security 给出的默认用户名为user 密码则是项目在启动运行时随机生成的一串字符串,会打印在控制台,如下图:
在这里插入图片描述
当我们访问index首页的时候,系统会默认跳转到login页面进行登录认证

在这里插入图片描述
认证成功之后才会跳转到我们的index页面
在这里插入图片描述

三、Spring Security用户密码配置

除了上面Spring Security在不进行任何配置下默认给出的用户user 密码随项目启动生成随机字符串,我们还可以通过以下方式配置

1、springboot配置文件中配置

  1. spring:
  2. security:
  3. user:
  4. name: admin # 用户名
  5. password: 123456 # 密码

2、java代码在内存中配置

新建Security 核心配置类继承WebSecurityConfigurerAdapter

  1. @Configuration
  2. @EnableWebSecurity // 启用Spring Security的Web安全支持
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4. /**
  5. * 将用户设置在内存中
  6. * @param auth
  7. * @throws Exception
  8. */
  9. @Autowired
  10. public void config(AuthenticationManagerBuilder auth) throws Exception {
  11. // 在内存中配置用户,配置多个用户调用`and()`方法
  12. auth.inMemoryAuthentication()
  13. .passwordEncoder(passwordEncoder()) // 指定加密方式
  14. .withUser("admin").password(passwordEncoder().encode("123456")).roles("ADMIN")
  15. .and()
  16. .withUser("test").password(passwordEncoder().encode("123456")).roles("USER");
  17. }
  18. @Bean
  19. public PasswordEncoder passwordEncoder() {
  20. // BCryptPasswordEncoder:Spring Security 提供的加密工具,可快速实现加密加盐
  21. return new BCryptPasswordEncoder();
  22. }
  23. }

3、从数据库中获取用户账号、密码信息

这种方式也就是我们项目中通常使用的方式,这个留到后面的文章再说

四、Spring Security 登录处理 与 忽略拦截

相关代码都有注释相信很容易理解

  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4. /**
  5. * 登录处理
  6. * @param http
  7. * @throws Exception
  8. */
  9. @Override
  10. protected void configure(HttpSecurity http) throws Exception {
  11. // 开启登录配置
  12. http.authorizeRequests()
  13. // 标识访问 `/index` 这个接口,需要具备`ADMIN`角色
  14. .antMatchers("/index").hasRole("ADMIN")
  15. // 允许匿名的url - 可理解为放行接口 - 多个接口使用,分割
  16. .antMatchers("/", "/home").permitAll()
  17. // 其余所有请求都需要认证
  18. .anyRequest().authenticated()
  19. .and()
  20. // 设置登录认证页面
  21. .formLogin().loginPage("/login")
  22. // 登录成功后的处理接口 - 方式①
  23. .loginProcessingUrl("/home")
  24. // 自定义登陆用户名和密码属性名,默认为 username和password
  25. .usernameParameter("username")
  26. .passwordParameter("password")
  27. // 登录成功后的处理器 - 方式②
  28. // .successHandler((req, resp, authentication) -> {
  29. // resp.setContentType("application/json;charset=utf-8");
  30. // PrintWriter out = resp.getWriter();
  31. // out.write("登录成功...");
  32. // out.flush();
  33. // })
  34. // 配置登录失败的回调
  35. .failureHandler((req, resp, exception) -> {
  36. resp.setContentType("application/json;charset=utf-8");
  37. PrintWriter out = resp.getWriter();
  38. out.write("登录失败...");
  39. out.flush();
  40. })
  41. .permitAll()//和表单登录相关的接口统统都直接通过
  42. .and()
  43. .logout().logoutUrl("/logout")
  44. // 配置注销成功的回调
  45. .logoutSuccessHandler((req, resp, authentication) -> {
  46. resp.setContentType("application/json;charset=utf-8");
  47. PrintWriter out = resp.getWriter();
  48. out.write("注销成功...");
  49. out.flush();
  50. })
  51. .permitAll()
  52. .and()
  53. .httpBasic()
  54. .and()
  55. // 关闭CSRF跨域
  56. .csrf().disable();
  57. }
  58. /**
  59. * 忽略拦截
  60. * @param web
  61. * @throws Exception
  62. */
  63. @Override
  64. public void configure(WebSecurity web) throws Exception {
  65. // 设置拦截忽略url - 会直接过滤该url - 将不会经过Spring Security过滤器链
  66. web.ignoring().antMatchers("/getUserInfo");
  67. // 设置拦截忽略文件夹,可以对静态资源放行
  68. web.ignoring().antMatchers("/css/**", "/js/**");
  69. }
  70. }

五、总结

  1. 项目引入Spring Security依赖
  2. 自定义Security核心配置类继承WebSecurityConfigurerAdapter
  3. 账号密码配置
  4. 登录处理
  5. 忽略拦截

案例demo源码

java-workspace: 存放案例demo代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/870186
推荐阅读
相关标签
  

闽ICP备14008679号