一、安全

Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型。他可以实现强大的web安全控制。对于安全控制,我们仅需引入spring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理。几个类:
WebSecurityConfigurerAdapter:自定义Security策略
AuthenticationManagerBuilder:自定义认证策略
@EnableWebSecurity:开启WebSecurity模式

•应用程序的两个主要区域是“认证”和“授权”(或者访问控制)。这两个主要区域是· Spring Security 的两个目标。

•“认证”(Authentication),是建立一个他声明的主体的过程(一个“主体”一般是指 用户,设备或一些可以在你的应用程序中执行动作的其他系统)。

•“授权”(Authorization)指确定一个主体是否允许在你的应用程序执行一个动作的过 程。为了抵达需要授权的店,主体的身份已经有认证过程建立。

•这个概念是通用的而不只在Spring Security中。

  1. /**
  2. * 1、引入 Spring Security 模块的启动器
  3. * 2、编写 Spring Security 的配置类
  4. * @EnableWebSecurity
  5. * public class MySecurityConfig extends WebSecurityConfigurerAdapter
  6. * 3、控制请求的访问权限
  7. *
  8. */
  9. @SpringBootApplication
  10. public class Springboot05SecurityApplication {
  11. public static void main(String[] args) {
  12. SpringApplication.run(Springboot05SecurityApplication.class, args);
  13. }
  14. }
  15. @EnableWebSecurity
  16. public class MySecurityConfig extends WebSecurityConfigurerAdapter {
  17. /**
  18. * 定义授权规则
  19. * @param http
  20. * @throws Exception
  21. */
  22. @Override
  23. protected void configure(HttpSecurity http) throws Exception {
  24. // 定制请求的授权规则
  25. http.authorizeRequests()
  26. .antMatchers("/").permitAll()
  27. .antMatchers("/level1/**").hasRole("vip1")
  28. .antMatchers("/level2/**").hasRole("vip2")
  29. .antMatchers("/level3/**").hasRole("vip3");
  30. // 开启自动配置的登录功能,如果没有权限,就会来到登录页面
  31. http.formLogin();
  32. // 1、login请求来到登录页面
  33. // 2、登陆失败重定向 /login?error
  34. // 3、更多详细规则
  35. }
  36. /**
  37. * 定义认证规则
  38. * @param auth
  39. * @throws Exception
  40. */
  41. @Override
  42. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  43. auth.inMemoryAuthentication()
  44. .passwordEncoder(passwordEncoder())
  45. .withUser("admin").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip2")
  46. .and()
  47. .withUser("lisi").password(new BCryptPasswordEncoder().encode("123")).roles("vip2","vip3")
  48. .and()
  49. .withUser("wangwu").password(new BCryptPasswordEncoder().encode("123")).roles("vip1","vip3");
  50. }
  51. private PasswordEncoder passwordEncoder() {
  52. return new BCryptPasswordEncoder();
  53. }
  54. }

登录登出

  1. // 开启自动配置的注销功能
  2. http.logout().logoutSuccessUrl("/");//注销成功以后来到首页
  3. // 1、访问 /logout 表示用户注销,清空session
  4. // 2、注销成功返回 /login?logout 页面

权限控制显示

  1. <html xmlns:th="http://www.thymeleaf.org"
  2. xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
  1. <div sec:authorize="isAuthenticated()">
  2. <h2><span sec:authentication="name"></span>,你的角色有:<span sec:authentication="principal.authorities"></span></h2>
  3. <form th:action="@{/logout}" method="post">
  4. <input type="submit" th:value="注销"/>
  5. </form>
  6. </div>
  7. <div sec:authorize="hasRole('vip1')">
  8. <h3>普通武功秘籍</h3>
  9. <ul>
  10. <li><a th:href="@{/level1/1}">罗汉拳</a></li>
  11. <li><a th:href="@{/level1/2}">武当长拳</a></li>
  12. <li><a th:href="@{/level1/3}">全真剑法</a></li>
  13. </ul>
  14. </div>
  15. <div sec:authorize="hasRole('vip2')">
  16. <h3>高级武功秘籍</h3>
  17. <ul>
  18. <li><a th:href="@{/level2/1}">太极拳</a></li>
  19. <li><a th:href="@{/level2/2}">七伤拳</a></li>
  20. <li><a th:href="@{/level2/3}">梯云纵</a></li>
  21. </ul>
  22. </div>
  23. <div sec:authorize="hasRole('vip3')">
  24. <h3>绝世武功秘籍</h3>
  25. <ul>
  26. <li><a th:href="@{/level3/1}">葵花宝典</a></li>
  27. <li><a th:href="@{/level3/2}">龟派气功</a></li>
  28. <li><a th:href="@{/level3/3}">独孤九剑</a></li>
  29. </ul>
  30. </div>

记住我、定制登录页面

  1. // 开启记住我功能
  2. http.rememberMe();
  3. // 登录成功以后,将cookie发送给浏览器保存,以后登录带上这个cookie,只要通过检查既可以免登录,
  4. // 点击注销,删除cookie