当前位置:Gxlcms > 数据库问题 > spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

时间:2021-07-01 10:21:17 帮助过:5人阅读

github.com/liuhongdi/securitylogin

 

2,项目功能说明

        演示了使用数据库实现的用户RBAC权限管理 

       三种页面:

        无权限限制页面:任何人都可访问

        需登录页面:修改密码等:登录才可以访问

       有权限限制页面:必须授予相应的角色后才能访问

 

3,项目结构:如图:

技术图片

技术图片

技术图片

 

三,配置文件说明

1,pom.xml

  1. <span style="color: #008000;"><!--</span><span style="color: #008000;">security begin</span><span style="color: #008000;">--></span>
  2. <span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  3. <span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>org.springframework.boot<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
  4. <span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>spring-boot-starter-security<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
  5. <span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  6. <span style="color: #008000;"><!--</span><span style="color: #008000;">thymeleaf begin</span><span style="color: #008000;">--></span>
  7. <span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  8. <span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>org.springframework.boot<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
  9. <span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>spring-boot-starter-thymeleaf<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
  10. <span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  11. <span style="color: #008000;"><!--</span><span style="color: #008000;">validation begin</span><span style="color: #008000;">--></span>
  12. <span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  13. <span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>org.springframework.boot<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
  14. <span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>spring-boot-starter-validation<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
  15. <span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  16. <span style="color: #008000;"><!--</span><span style="color: #008000;">mysql mybatis begin</span><span style="color: #008000;">--></span>
  17. <span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  18. <span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>org.mybatis.spring.boot<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
  19. <span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>mybatis-spring-boot-starter<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
  20. <span style="color: #0000ff;"><</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>2.1.3<span style="color: #0000ff;"></</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>
  21. <span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  22. <span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  23. <span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>mysql<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
  24. <span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>mysql-connector-java<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
  25. <span style="color: #0000ff;"><</span><span style="color: #800000;">scope</span><span style="color: #0000ff;">></span>runtime<span style="color: #0000ff;"></</span><span style="color: #800000;">scope</span><span style="color: #0000ff;">></span>
  26. <span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  27. <span style="color: #008000;"><!--</span><span style="color: #008000;"> JSON解析fastjson begin</span><span style="color: #008000;">--></span>
  28. <span style="color: #0000ff;"><</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>
  29. <span style="color: #0000ff;"><</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>com.alibaba<span style="color: #0000ff;"></</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">></span>
  30. <span style="color: #0000ff;"><</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>fastjson<span style="color: #0000ff;"></</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">></span>
  31. <span style="color: #0000ff;"><</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>1.2.72<span style="color: #0000ff;"></</span><span style="color: #800000;">version</span><span style="color: #0000ff;">></span>
  32. <span style="color: #0000ff;"></</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">></span>

 

2,application.properties

  1. <span style="color: #000000;">#thymeleaf
  2. spring.thymeleaf.cache</span>=<span style="color: #0000ff;">false</span><span style="color: #000000;">
  3. spring.thymeleaf.encoding</span>=UTF-8<span style="color: #000000;">
  4. spring.thymeleaf.mode</span>=<span style="color: #000000;">HTML
  5. spring.thymeleaf.prefix</span>=classpath:/templates/<span style="color: #000000;">
  6. spring.thymeleaf.suffix</span>=<span style="color: #000000;">.html
  7. #mysql
  8. spring.datasource.url</span>=jdbc:mysql:<span style="color: #008000;">//</span><span style="color: #008000;">localhost:3306/security?characterEncoding=utf8&useSSL=false</span>
  9. spring.datasource.username=<span style="color: #000000;">root
  10. spring.datasource.password</span>=<span style="color: #000000;">lhddemo
  11. spring.datasource.driver</span>-<span style="color: #0000ff;">class</span>-name=<span style="color: #000000;">com.mysql.cj.jdbc.Driver
  12. #mybatis
  13. mybatis.mapper</span>-locations=classpath:/mapper<span style="color: #008000;">/*</span><span style="color: #008000;">Mapper.xml
  14. mybatis.type-aliases-package=com.example.demo.mapper
  15. #error
  16. server.error.include-stacktrace=always
  17. #log
  18. logging.level.org.springframework.web=trace</span>

 

3,数据库:

技术图片

 

 表结构:

  1. <span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> `sys_user` (
  2. `userId` </span><span style="color: #0000ff;">int</span>(<span style="color: #800000; font-weight: bold;">11</span>) <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span> AUTO_INCREMENT COMMENT <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">id</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  3. `userName` </span><span style="color: #0000ff;">varchar</span>(<span style="color: #800000; font-weight: bold;">100</span>) <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #ff0000;">‘‘</span> COMMENT <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">用户名</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  4. `password` </span><span style="color: #0000ff;">varchar</span>(<span style="color: #800000; font-weight: bold;">100</span>) <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #ff0000;">‘‘</span> COMMENT <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">密码</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  5. `nickName` </span><span style="color: #0000ff;">varchar</span>(<span style="color: #800000; font-weight: bold;">100</span>) <span style="color: #0000ff;">CHARACTER</span> <span style="color: #0000ff;">SET</span> utf8mb4 COLLATE utf8mb4_0900_ai_ci <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #ff0000;">‘‘</span> COMMENT <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">昵称</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  6. </span><span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span><span style="color: #000000;"> (`userId`),
  7. </span><span style="color: #0000ff;">UNIQUE</span> <span style="color: #0000ff;">KEY</span><span style="color: #000000;"> `userName` (`userName`)
  8. ) ENGINE</span><span style="color: #808080;">=</span>InnoDB AUTO_INCREMENT<span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">0</span> <span style="color: #0000ff;">DEFAULT</span> CHARSET<span style="color: #808080;">=</span>utf8mb4 COLLATE<span style="color: #808080;">=</span>utf8mb4_0900_ai_ci COMMENT<span style="color: #808080;">=</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">用户表</span><span style="color: #ff0000;">‘</span>

添加数据 :

  1. <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> `sys_user` (`userId`, `userName`, `password`, `nickName`) <span style="color: #0000ff;">VALUES</span><span style="color: #000000;">
  2. (</span><span style="color: #800000; font-weight: bold;">1</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">lhd</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">$2a$10$yGcOz3ekNI6Ya67tqQueS.raxyTOedGsv5jh2BwtRrI5/K9QEIPGq</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">老刘</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  3. (</span><span style="color: #800000; font-weight: bold;">2</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">admin</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">$2a$10$yGcOz3ekNI6Ya67tqQueS.raxyTOedGsv5jh2BwtRrI5/K9QEIPGq</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">管理员</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  4. (</span><span style="color: #800000; font-weight: bold;">3</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">merchant</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">$2a$10$yGcOz3ekNI6Ya67tqQueS.raxyTOedGsv5jh2BwtRrI5/K9QEIPGq</span><span style="color: #ff0000;">‘</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">商户老张</span><span style="color: #ff0000;">‘</span>);

说明:3个密码都是111111,仅供演示使用,大家在生产环境中一定不要这样设置

  1. <span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> `sys_user_role` (
  2. `urId` </span><span style="color: #0000ff;">int</span>(<span style="color: #800000; font-weight: bold;">11</span>) <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span> AUTO_INCREMENT COMMENT <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">id</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  3. `userId` </span><span style="color: #0000ff;">int</span>(<span style="color: #800000; font-weight: bold;">11</span>) <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">0</span><span style="color: #ff0000;">‘</span> COMMENT <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">用户id</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  4. `roleName` </span><span style="color: #0000ff;">varchar</span>(<span style="color: #800000; font-weight: bold;">20</span>) <span style="color: #0000ff;">CHARACTER</span> <span style="color: #0000ff;">SET</span> utf8mb4 COLLATE utf8mb4_0900_ai_ci <span style="color: #808080;">NOT</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #ff0000;">‘‘</span> COMMENT <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">角色id</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">,
  5. </span><span style="color: #0000ff;">PRIMARY</span> <span style="color: #0000ff;">KEY</span><span style="color: #000000;"> (`urId`),
  6. </span><span style="color: #0000ff;">UNIQUE</span> <span style="color: #0000ff;">KEY</span><span style="color: #000000;"> `userId` (`userId`,`roleName`)
  7. ) ENGINE</span><span style="color: #808080;">=</span>InnoDB AUTO_INCREMENT<span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">0</span> <span style="color: #0000ff;">DEFAULT</span> CHARSET<span style="color: #808080;">=</span>utf8mb4 COLLATE<span style="color: #808080;">=</span>utf8mb4_0900_ai_ci COMMENT<span style="color: #808080;">=</span><span style="color: #ff0000;">‘</span><span style="color: #ff0000;">用户角色关联表</span><span style="color: #ff0000;">‘</span>

插入数据:

  1. <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> `sys_user_role` (`urId`, `userId`, `roleName`) <span style="color: #0000ff;">VALUES</span><span style="color: #000000;">
  2. (</span><span style="color: #800000; font-weight: bold;">1</span>, <span style="color: #800000; font-weight: bold;">2</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">ADMIN</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">),
  3. (</span><span style="color: #800000; font-weight: bold;">2</span>, <span style="color: #800000; font-weight: bold;">3</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">MERCHANT</span><span style="color: #ff0000;">‘</span>);

 

四,java代码说明

1,WebSecurityConfig.java

  1. <span style="color: #000000;">@Configuration
  2. @EnableWebSecurity
  3. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> WebSecurityConfig <span style="color: #0000ff;">extends</span><span style="color: #000000;"> WebSecurityConfigurerAdapter {
  4. </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">final</span> <span style="color: #0000ff;">static</span> BCryptPasswordEncoder ENCODER = <span style="color: #0000ff;">new</span><span style="color: #000000;"> BCryptPasswordEncoder();
  5. @Resource
  6. </span><span style="color: #0000ff;">private</span> UserLoginFailureHandler userLoginFailureHandler;<span style="color: #008000;">//</span><span style="color: #008000;">登录失败的处理类</span>
  7. <span style="color: #000000;"> @Resource
  8. </span><span style="color: #0000ff;">private</span> UserLoginSuccessHandler userLoginSuccessHandler;<span style="color: #008000;">//</span><span style="color: #008000;">登录成功的处理类</span>
  9. <span style="color: #000000;"> @Resource
  10. </span><span style="color: #0000ff;">private</span> UserLogoutSuccessHandler userLogoutSuccessHandler;<span style="color: #008000;">//</span><span style="color: #008000;">退出成功的处理类</span>
  11. <span style="color: #000000;"> @Resource
  12. </span><span style="color: #0000ff;">private</span> UserAccessDeniedHandler userAccessDeniedHandler;<span style="color: #008000;">//</span><span style="color: #008000;">无权访问的处理类</span>
  13. <span style="color: #000000;"> @Resource
  14. </span><span style="color: #0000ff;">private</span> SecUserDetailService secUserDetailService; <span style="color: #008000;">//</span><span style="color: #008000;">用户信息类,用来得到UserDetails
  15. </span><span style="color: #008000;">//</span><span style="color: #008000;">指定加密的方式,避免出现:There is no PasswordEncoder mapped for the id "null"</span>
  16. <span style="color: #000000;"> @Bean
  17. </span><span style="color: #0000ff;">public</span> PasswordEncoder passwordEncoder(){<span style="color: #008000;">//</span><span style="color: #008000;">密码加密类</span>
  18. <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> BCryptPasswordEncoder();
  19. }
  20. @Override
  21. </span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">void</span> configure(HttpSecurity http) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {
  22. </span><span style="color: #008000;">//</span><span style="color: #008000;">static</span>
  23. <span style="color: #000000;"> http.authorizeRequests()
  24. .antMatchers(</span>"/css/**","/js/**","/img/**")<span style="color: #008000;">//</span><span style="color: #008000;">静态资源等不需要验证</span>
  25. <span style="color: #000000;"> .permitAll();
  26. </span><span style="color: #008000;">//</span><span style="color: #008000;">permitall</span>
  27. <span style="color: #000000;"> http.authorizeRequests()
  28. .antMatchers(</span>"/home/**")<span style="color: #008000;">//permitall</span>
  29. <span style="color: #000000;"> .permitAll();
  30. </span><span style="color: #008000;">//</span><span style="color: #008000;">login</span>
  31. <span style="color: #000000;"> http.formLogin()
  32. .loginPage(</span>"/login/login"<span style="color: #000000;">)
  33. .loginProcessingUrl(</span>"/login/logined")<span style="color: #008000;">//</span><span style="color: #008000;">发送Ajax请求的路径</span>
  34. .usernameParameter("username")<span style="color: #008000;">//</span><span style="color: #008000;">请求验证参数</span>
  35. .passwordParameter("password")<span style="color: #008000;">//</span><span style="color: #008000;">请求验证参数</span>
  36. .failureHandler(userLoginFailureHandler)<span style="color: #008000;">//</span><span style="color: #008000;">验证失败处理</span>
  37. .successHandler(userLoginSuccessHandler)<span style="color: #008000;">//</span><span style="color: #008000;">验证成功处理</span>
  38. .permitAll(); <span style="color: #008000;">//</span><span style="color: #008000;">登录页面用户任意访问
  39. </span><span style="color: #008000;">//</span><span style="color: #008000;">logout</span>
  40. <span style="color: #000000;"> http.logout()
  41. .logoutUrl(</span>"/login/logout"<span style="color: #000000;">)
  42. .logoutSuccessUrl(</span>"/login/logout"<span style="color: #000000;">)
  43. .logoutSuccessHandler(userLogoutSuccessHandler)</span><span style="color: #008000;">//</span><span style="color: #008000;">登出处理</span>
  44. .deleteCookies("JSESSIONID"<span style="color: #000000;">)
  45. .clearAuthentication(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)
  46. .invalidateHttpSession(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)
  47. .permitAll();
  48. </span><span style="color: #008000;">//</span><span style="color: #008000;">有角色的用户才能访问</span>
  49. <span style="color: #000000;"> http.authorizeRequests()
  50. .antMatchers(</span>"/admin/**").hasRole("ADMIN"<span style="color: #000000;">)
  51. .antMatchers(</span>"/merchant/**").hasAnyRole("MERCHANT","ADMIN"<span style="color: #000000;">);
  52. </span><span style="color: #008000;">//</span><span style="color: #008000;">其他任何请求,登录后可以访问</span>
  53. <span style="color: #000000;"> http.authorizeRequests().anyRequest().authenticated();
  54. </span><span style="color: #008000;">//</span><span style="color: #008000;">accessdenied</span>
  55. http.exceptionHandling().accessDeniedHandler(userAccessDeniedHandler);<span style="color: #008000;">//</span><span style="color: #008000;">无权限时的处理
  56. </span><span style="color: #008000;">//</span><span style="color: #008000;">user detail</span>
  57. <span style="color: #000000;"> http.userDetailsService(secUserDetailService);
  58. </span><span style="color: #008000;">//</span><span style="color: #008000;">rememberme
  59. </span><span style="color: #008000;">//</span><span style="color: #008000;">图形验证码
  60. </span><span style="color: #008000;">//</span><span style="color: #008000;">http.csrf().disable();</span>
  61. <span style="color: #000000;"> }
  62. @Resource
  63. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> configureGlobal(AuthenticationManagerBuilder auth) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {
  64. auth.userDetailsService(secUserDetailService).passwordEncoder(</span><span style="color: #0000ff;">new</span><span style="color: #000000;"> PasswordEncoder() {
  65. @Override
  66. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String encode(CharSequence charSequence) {
  67. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> ENCODER.encode(charSequence);
  68. }
  69. </span><span style="color: #008000;">//</span><span style="color: #008000;">密码匹配,看输入的密码经过加密与数据库中存放的是否一样</span>
  70. <span style="color: #000000;"> @Override
  71. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span><span style="color: #000000;"> matches(CharSequence charSequence, String s) {
  72. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> ENCODER.matches(charSequence,s);
  73. }
  74. });
  75. }
  76. }</span>

 

2,SecUser.java

  1. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> SecUser <span style="color: #0000ff;">extends</span><span style="color: #000000;"> User {
  2. </span><span style="color: #008000;">//</span><span style="color: #008000;">用户id</span>
  3. <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> userid;
  4. </span><span style="color: #008000;">//</span><span style="color: #008000;">用户昵称</span>
  5. <span style="color: #0000ff;">private</span><span style="color: #000000;"> String nickname;
  6. </span><span style="color: #0000ff;">public</span> SecUser(String username, String password, Collection<? <span style="color: #0000ff;">extends</span> GrantedAuthority><span style="color: #000000;"> authorities) {
  7. </span><span style="color: #0000ff;">super</span><span style="color: #000000;">(username, password, authorities);
  8. }
  9. </span><span style="color: #0000ff;">public</span> SecUser(String username, String password, <span style="color: #0000ff;">boolean</span> enabled, <span style="color: #0000ff;">boolean</span> accountNonExpired, <span style="color: #0000ff;">boolean</span> credentialsNonExpired, <span style="color: #0000ff;">boolean</span> accountNonLocked, Collection<? <span style="color: #0000ff;">extends</span> GrantedAuthority><span style="color: #000000;"> authorities) {
  10. </span><span style="color: #0000ff;">super</span><span style="color: #000000;">(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
  11. }
  12. </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getNickname() {
  13. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> nickname;
  14. }
  15. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setNickname(String nickname) {
  16. </span><span style="color: #0000ff;">this</span>.nickname =<span style="color: #000000;"> nickname;
  17. }
  18. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getUserid() {
  19. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> userid;
  20. }
  21. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setUserid(<span style="color: #0000ff;">int</span><span style="color: #000000;"> userid) {
  22. </span><span style="color: #0000ff;">this</span>.userid =<span style="color: #000000;"> userid;
  23. }
  24. }</span>

spring security中User类的子类,增加了用户id和昵称,

需要保存到session中的信息,在这里扩展

目的是避免在每个页面上显示用户信息需要查数据库

 

3,SecUserDetailService.java

  1. <span style="color: #008000;">/**</span><span style="color: #008000;">
  2. * Created by liuhongdi on 2020/07/09.
  3. </span><span style="color: #008000;">*/</span><span style="color: #000000;">
  4. @Component(</span>"SecUserDetailService"<span style="color: #000000;">)
  5. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> SecUserDetailService <span style="color: #0000ff;">implements</span><span style="color: #000000;"> UserDetailsService{
  6. @Resource
  7. </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SysUserService sysUserService;
  8. @Override
  9. </span><span style="color: #0000ff;">public</span> UserDetails loadUserByUsername(String s) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> UsernameNotFoundException {
  10. </span><span style="color: #008000;">//</span><span style="color: #008000;">查库</span>
  11. SysUser oneUser = sysUserService.getOneUserByUsername(s);<span style="color: #008000;">//</span><span style="color: #008000;">数据库查询 看用户是否存在</span>
  12. String encodedPassword =<span style="color: #000000;"> oneUser.getPassword();
  13. Collection</span><GrantedAuthority> collection = <span style="color: #0000ff;">new</span> ArrayList<>();<span style="color: #008000;">//</span><span style="color: #008000;">权限集合
  14. </span><span style="color: #008000;">//</span><span style="color: #008000;">用户权限:需要加 ROLE_</span>
  15. List<String> roles =<span style="color: #000000;"> oneUser.getRoles();
  16. </span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println(roles);</span>
  17. <span style="color: #0000ff;">for</span><span style="color: #000000;"> (String roleone : roles) {
  18. GrantedAuthority grantedAuthority </span>= <span style="color: #0000ff;">new</span> SimpleGrantedAuthority("ROLE_"+<span style="color: #000000;">roleone);
  19. collection.add(grantedAuthority);
  20. }
  21. </span><span style="color: #008000;">//</span><span style="color: #008000;">增加用户的userid,nickname</span>
  22. SecUser user = <span style="color: #0000ff;">new</span><span style="color: #000000;"> SecUser(s,encodedPassword,collection);
  23. user.setUserid(oneUser.getUserId());
  24. user.setNickname(oneUser.getNickName());
  25. </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> user;
  26. }
  27. }</span>

 

4,UserAccessDeniedHandler.java

  1. @Component("UserAccessDeniedHandler"<span style="color: #000000;">)
  2. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> UserAccessDeniedHandler <span style="color: #0000ff;">implements</span><span style="color: #000000;"> AccessDeniedHandler {
  3. @Override
  4. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
  5. AccessDeniedException e) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException, ServletException {
  6. </span><span style="color: #0000ff;">boolean</span> isAjax =<span style="color: #000000;"> ServletUtil.isAjax();
  7. </span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println("isajax:"+isAjax);</span>
  8. <span style="color: #0000ff;">if</span> (isAjax == <span style="color: #0000ff;">true</span><span style="color: #000000;">) {
  9. ServletUtil.printRestResult(RestResult.error(ResponseCode.ACCESS_DENIED));
  10. } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
  11. ServletUtil.printString(ResponseCode.ACCESS_DENIED.getMsg());
  12. }
  13. }
  14. }</span>

 

5,UserLoginFailureHandler.java

  1. @Component("UserLoginFailureHandler"<span style="color: #000000;">)
  2. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> UserLoginFailureHandler <span style="color: #0000ff;">extends</span><span style="color: #000000;"> SimpleUrlAuthenticationFailureHandler {
  3. @Override
  4. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
  5. AuthenticationException exception) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException, ServletException {
  6. </span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println("UserLoginFailureHandler");</span>
  7. <span style="color: #000000;"> ServletUtil.printRestResult(RestResult.error(ResponseCode.LOGIN_FAIL));
  8. }
  9. }</span>

 

6,UserLoginSuccessHandler.java

  1. @Component("UserLoginSuccessHandler"<span style="color: #000000;">)
  2. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> UserLoginSuccessHandler <span style="color: #0000ff;">extends</span><span style="color: #000000;"> SimpleUrlAuthenticationSuccessHandler {
  3. @Override
  4. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException, ServletException {
  5. </span><span style="color: #008000;">//</span><span style="color: #008000;">System.out.println("UserLoginSuccessHandler");</span>
  6. ServletUtil.printRestResult(RestResult.success(0,"登录成功"<span style="color: #000000;">));
  7. }
  8. }</span>

 

7,UserLogoutSuccessHandler.java

  1. @Component("UserLogoutSuccessHandler"<span style="color: #000000;">)
  2. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> UserLogoutSuccessHandler <span style="color: #0000ff;">implements</span><span style="color: #000000;"> LogoutSuccessHandler{
  3. @Override
  4. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> onLogoutSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) <span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException, ServletException {
  5. httpServletRequest.getSession().invalidate();
  6. ServletUtil.printRestResult(RestResult.success(</span>0,"退出成功"<span style="color: #000000;">));
  7. }
  8. }</span>

 

8,WebInterceptor.java

  1. <span style="color: #000000;">@Component
  2. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> WebInterceptor <span style="color: #0000ff;">extends</span><span style="color: #000000;"> HandlerInterceptorAdapter {
  3. </span><span style="color: #008000;">//</span><span style="color: #008000;">如果view不为空,把登录信息传递给模板</span>
  4. <span style="color: #000000;"> @Override
  5. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
  6. </span><span style="color: #0000ff;">if</span> (modelAndView != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
  7. ModelMap modelMap </span>=<span style="color: #000000;"> modelAndView.getModelMap();
  8. SecUser currentUser </span>=<span style="color: #000000;"> SessionUtil.getCurrentUser();
  9. </span><span style="color: #0000ff;">if</span> (currentUser != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {
  10. modelMap.addAttribute(</span>"is_login","1"<span style="color: #000000;">);
  11. modelMap.addAttribute(</span>"login_username"<span style="color: #000000;">,currentUser.getNickname());
  12. } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
  13. modelMap.addAttribute(</span>"is_login","0"<span style="color: #000000;">);
  14. modelMap.addAttribute(</span>"login_username",""<span style="color: #000000;">);
  15. }
  16. }
  17. }
  18. }</span>

负责把传递页面公共部分显示的数据到模板

 

9,login.html

  1. <span style="color: #0000ff;"><!</span><span style="color: #ff00ff;">DOCTYPE html</span><span style="color: #0000ff;">></span>
  2. <span style="color: #0000ff;"><</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>
  3. <span style="color: #0000ff;"><</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span>
  4. <span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">content</span><span style="color: #0000ff;">="text/html;charset=UTF-8"</span><span style="color: #0000ff;">/></span>
  5. <span style="color: #0000ff;"><</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span>登录页面<span style="color: #0000ff;"></</span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span>
  6. <span style="color: #0000ff;"><</span><span style="color: #800000;">script </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;"> language</span><span style="color: #0000ff;">="JavaScript"</span><span style="color: #ff0000;"> src</span><span style="color: #0000ff;">="/js/jquery-1.6.2.min.js"</span><span style="color: #0000ff;">></</span><span style="color: #800000;">script</span><span style="color: #0000ff;">></span>
  7. <span style="color: #0000ff;"><</span><span style="color: #800000;">style </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/css"</span><span style="color: #0000ff;">></span><span style="background-color: #f5f5f5; color: #800000;">
  8. body </span><span style="background-color: #f5f5f5; color: #000000;">{</span><span style="background-color: #f5f5f5; color: #ff0000;">
  9. padding-top</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;"> 50px</span><span style="background-color: #f5f5f5; color: #000000;">;</span>
  10. <span style="background-color: #f5f5f5; color: #000000;">}</span><span style="background-color: #f5f5f5; color: #800000;">
  11. .starter-template </span><span style="background-color: #f5f5f5; color: #000000;">{</span><span style="background-color: #f5f5f5; color: #ff0000;">
  12. padding</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;"> 40px 15px</span><span style="background-color: #f5f5f5; color: #000000;">;</span><span style="background-color: #f5f5f5; color: #ff0000;">
  13. text-align</span><span style="background-color: #f5f5f5; color: #000000;">:</span><span style="background-color: #f5f5f5; color: #0000ff;"> center</span><span style="background-color: #f5f5f5; color: #000000;">;</span>
  14. <span style="background-color: #f5f5f5; color: #000000;">}</span>
  15. <span style="color: #0000ff;"></</span><span style="color: #800000;">style</span><span style="color: #0000ff;">></span>
  16. <span style="color: #008000;"><!--</span><span style="color: #008000;"> CSRF </span><span style="color: #008000;">--></span>
  17. <span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="_csrf"</span><span style="color: #ff0000;"> th:content</span><span style="color: #0000ff;">="${_csrf.token}"</span><span style="color: #0000ff;">/></span>
  18. <span style="color: #008000;"><!--</span><span style="color: #008000;"> default header name is X-CSRF-TOKEN </span><span style="color: #008000;">--></span>
  19. <span style="color: #0000ff;"><</span><span style="color: #800000;">meta </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="_csrf_header"</span><span style="color: #ff0000;"> th:content</span><span style="color: #0000ff;">="${_csrf.headerName}"</span><span style="color: #0000ff;">/></span>
  20. <span style="color: #0000ff;"></</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span>
  21. <span style="color: #0000ff;"><</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span>
  22. <span style="color: #0000ff;"><</span><span style="color: #800000;">nav </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="navbar navbar-inverse navbar-fixed-top"</span><span style="color: #0000ff;">></span>
  23. <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="container"</span><span style="color: #0000ff;">></span>
  24. <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="navbar"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="collapse navbar-collapse"</span><span style="color: #0000ff;">></span>
  25. <span style="color: #0000ff;"><</span><span style="color: #800000;">ul </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="nav navbar-nav"</span><span style="color: #0000ff;">></span>
  26. <span style="color: #0000ff;"><</span><span style="color: #800000;">li</span><span style="color: #0000ff;">><</span><span style="color: #800000;">a </span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="/home/home"</span><span style="color: #0000ff;">></span> 首页 <span style="color: #0000ff;"></</span><span style="color: #800000;">a</span><span style="color: #0000ff;">></</span><span style="color: #800000;">li</span><span style="color: #0000ff;">></span>
  27. <span style="color: #0000ff;"></</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">></span>
  28. <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span><span style="color: #008000;"><!--</span><span style="color: #008000;">/.nav-collapse </span><span style="color: #008000;">--></span>
  29. <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  30. <span style="color: #0000ff;"></</span><span style="color: #800000;">nav</span><span style="color: #0000ff;">></span>
  31. <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="container"</span><span style="color: #0000ff;">></span>
  32. <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="starter-template"</span><span style="color: #0000ff;">></span>
  33. <span style="color: #0000ff;"><</span><span style="color: #800000;">h2</span><span style="color: #0000ff;">></span>使用账号密码登录<span style="color: #0000ff;"></</span><span style="color: #800000;">h2</span><span style="color: #0000ff;">></span>
  34. <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="form-group"</span><span style="color: #0000ff;">></span>
  35. <span style="color: #0000ff;"><</span><span style="color: #800000;">label </span><span style="color: #ff0000;">for</span><span style="color: #0000ff;">="username"</span><span style="color: #0000ff;">></span>账号<span style="color: #0000ff;"></</span><span style="color: #800000;">label</span><span style="color: #0000ff;">></span>
  36. <span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="form-control"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="username"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="username"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">=""</span><span style="color: #ff0000;"> placeholder</span><span style="color: #0000ff;">="账号"</span> <span style="color: #0000ff;">/></span>
  37. <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  38. <span style="color: #0000ff;"><</span><span style="color: #800000;">div </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="form-group"</span><span style="color: #0000ff;">></span>
  39. <span style="color: #0000ff;"><</span><span style="color: #800000;">label </span><span style="color: #ff0000;">for</span><span style="color: #0000ff;">="password"</span><span style="color: #0000ff;">></span>密码<span style="color: #0000ff;"></</span><span style="color: #800000;">label</span><span style="color: #0000ff;">></span>
  40. <span style="color: #0000ff;"><</span><span style="color: #800000;">input </span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="form-control"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;"> placeholder</span><span style="color: #0000ff;">="密码"</span> <span style="color: #0000ff;">/></span>
  41. <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  42. <span style="color: #0000ff;"><</span><span style="color: #800000;">button </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="formsubmit"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="登录"</span><span style="color: #ff0000;"> onclick</span><span style="color: #0000ff;">="go_login()"</span> <span style="color: #0000ff;">></span>登录<span style="color: #0000ff;"></</span><span style="color: #800000;">button</span><span style="color: #0000ff;">></span>
  43. <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  44. <span style="color: #0000ff;"></</span><span style="color: #800000;">div</span><span style="color: #0000ff;">></span>
  45. <span style="color: #0000ff;"><</span><span style="color: #800000;">script</span><span style="color: #0000ff;">></span>
  46. <span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;"> go_login(){
  47. </span><span style="background-color: #f5f5f5; color: #0000ff;">if</span><span style="background-color: #f5f5f5; color: #000000;"> ($(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">#username</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).val() </span><span style="background-color: #f5f5f5; color: #000000;">==</span> <span style="background-color: #f5f5f5; color: #000000;">""</span><span style="background-color: #f5f5f5; color: #000000;">) {
  48. alert(</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">用户名不可为空</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">);
  49. $(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">#username</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).focus();
  50. </span><span style="background-color: #f5f5f5; color: #0000ff;">return</span> <span style="background-color: #f5f5f5; color: #0000ff;">false</span><span style="background-color: #f5f5f5; color: #000000;">;
  51. }
  52. </span><span style="background-color: #f5f5f5; color: #0000ff;">if</span><span style="background-color: #f5f5f5; color: #000000;"> ($(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">#password</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).val() </span><span style="background-color: #f5f5f5; color: #000000;">==</span> <span style="background-color: #f5f5f5; color: #000000;">""</span><span style="background-color: #f5f5f5; color: #000000;">) {
  53. alert(</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">密码不可为空</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">);
  54. $(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">#password</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).focus();
  55. </span><span style="background-color: #f5f5f5; color: #0000ff;">return</span> <span style="background-color: #f5f5f5; color: #0000ff;">false</span><span style="background-color: #f5f5f5; color: #000000;">;
  56. }
  57. </span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;"> postdata </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;"> {
  58. username:$(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">#username</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).val(),
  59. password:$(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">#password</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).val(),
  60. }
  61. </span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;"> csrfToken </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;"> $(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">meta[name=‘_csrf‘]</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).attr(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">content</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">);
  62. </span><span style="background-color: #f5f5f5; color: #0000ff;">var</span><span style="background-color: #f5f5f5; color: #000000;"> csrfHeader </span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;"> $(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">meta[name=‘_csrf_header‘]</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">).attr(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">content</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">);
  63. $.ajax({
  64. type:</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">POST</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">,
  65. </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">type:"GET",</span>
  66. <span style="background-color: #f5f5f5; color: #000000;"> url:</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/login/logined</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">,
  67. data:postdata,
  68. </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">返回数据的格式</span>
  69. <span style="background-color: #f5f5f5; color: #000000;"> datatype: </span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">json</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">,</span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">"xml", "html", "script", "json", "jsonp", "text".</span>
  70. <span style="background-color: #f5f5f5; color: #000000;"> beforeSend: </span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(request) {
  71. request.setRequestHeader(csrfHeader, csrfToken); </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;"> 添加 CSRF Token</span>
  72. <span style="background-color: #f5f5f5; color: #000000;"> },
  73. success:</span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(data){
  74. </span><span style="background-color: #f5f5f5; color: #0000ff;">if</span><span style="background-color: #f5f5f5; color: #000000;"> (data.code </span><span style="background-color: #f5f5f5; color: #000000;">==</span> <span style="background-color: #f5f5f5; color: #000000;">0</span><span style="background-color: #f5f5f5; color: #000000;">) {
  75. alert(</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">login success:</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;">data.msg);
  76. window.location.href</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/home/home</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">;
  77. } </span><span style="background-color: #f5f5f5; color: #0000ff;">else</span><span style="background-color: #f5f5f5; color: #000000;"> {
  78. alert(</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">failed:</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">+</span><span style="background-color: #f5f5f5; color: #000000;">data.msg);</span>
  79. <span style="background-color: #f5f5f5; color: #000000;"> }
  80. },
  81. </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">调用执行后调用的函数</span>
  82. <span style="background-color: #f5f5f5; color: #000000;"> complete: </span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(XMLHttpRequest, textStatus){
  83. },
  84. </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">调用出错执行的函数</span>
  85. <span style="background-color: #f5f5f5; color: #000000;"> error: </span><span style="background-color: #f5f5f5; color: #0000ff;">function</span><span style="background-color: #f5f5f5; color: #000000;">(){
  86. </span><span style="background-color: #f5f5f5; color: #008000;">//</span><span style="background-color: #f5f5f5; color: #008000;">请求出错处理</span>
  87. <span style="background-color: #f5f5f5; color: #000000;"> alert(</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">error</span><span style="background-color: #f5f5f5; color: #000000;">‘</span><span style="background-color: #f5f5f5; color: #000000;">);
  88. }
  89. });
  90. }
  91. </span><span style="color: #0000ff;"></</span><span style="color: #800000;">script</span><span style="color: #0000ff;">></span>
  92. <span style="color: #0000ff;"></</span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span>
  93. <span style="color: #0000ff;"></</span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>

 

10,页面上用到的其他代码,可以移步github.com上查看

 

五,测试效果

1,访问首页:

  1. http:<span style="color: #008000;">//</span><span style="color: #008000;">127.0.0.1:8080/home/home</span>

未登录时:

技术图片

2,以普通用户lhd登录:

技术图片

访问:管理员首页/商户首页,都会得到提示

  1. 无权访问

访问修改密码 页面,可以访问

 

3,以merchant用户登录:

   role是MERCHANT

技术图片

访问:管理员首页,提示:

  1. 无权访问

访问商户首页:可以访问

访问修改密码 页面,可以访问

 

4,以admin用户登录:

role是ADMIN

技术图片

 

访问管理员首页:可以访问

访问商户首页:可以访问

访问修改密码 页面,可以访问

 

六,查看spring boot版本:

  1. <span style="color: #000000;"> . ____ _ __ _ _
  2. </span>/\\ / ___‘_ __ _ _(_)_ __ __ _ \ \ \ ( ( )\___ | ‘_ | ‘_| | ‘_ \/ _` | \ \ \ \\/ ___)| |_)| | | | | || (_| |<span style="color: #000000;"> ) ) ) )
  3. </span>‘ |____| .__|_| |_|_| |_\__, | / / / /
  4. =========|_|==============|___/=/_/_/_/<span style="color: #000000;">
  5. :: Spring Boot :: (v2.</span>3.1.RELEASE)

 

spring boot:spring security用mysql数据库实现RBAC权限管理(spring boot 2.3.1)

标签:dex   stack   pass   stat   格式   mamicode   except   森林   ast   

人气教程排行