当前位置:   article > 正文

【security】java springboot项目中使用springSecurity安全框架_spring security pom

spring security pom

第一步,创建springboot的web项目,并导入springSecurity的pom依赖

  1. <!-- spring-security 安全框架依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-security</artifactId>
  5. </dependency>
  6. <!-- spring-boot的web依赖(如果创建项目时没有勾选,可以手动加上) -->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>

springboot项目如果导入security依赖后会自动托管整个项目,前端在访问项目的任何路径时会被拦截并跳转到security默认的登录页面,登录用户名为user,密码为控制台启动项目时生成的随机密码

第二步 自定义设置用户的认证和请求权限设置

一、自定义设置用户的认证:创建一个配置类(类上加@Configuration),让该类继承WebSecurityConfigurerAdapter类,并添加@EnableGlobalMethodSecurity( prePostEnabled = true)注解启动权限管理功能,重写configure(AuthenticationManagerBuilder auth)方法实现用户登录认证

1.设置固定配置登录的用户(不常用)

  1. @Configuration
  2. //启动 权限管理功能
  3. @EnableGlobalMethodSecurity( prePostEnabled = true)
  4. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  5. // 重写配置权限的方法
  6. @Override
  7. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  8. // 固定配置登录的用户
  9. auth.inMemoryAuthentication() // 内存验证
  10. .withUser("tom") //登录的用户名
  11. .password("{bcrypt}$2a$10$Wg.X1U3cKklWFqiZVmIzSeDynq3LcgXRlVhBIAW0s0tmZLRd.5QWy") 登录的mm
  12. .authorities("abc") // 设置权限字符
  13. .and()
  14. .withUser("tom2") //第二个用户,以此类推,.and()后可继续添加用户
  15. .password("{bcrypt}$2a$10$Wg.X1U3cKklWFqiZVmIzSeDynq3LcgXRlVhBIAW0s0tmZLRd.5QWy") //登录的密码
  16. .authorities("abc"); // 设置权限字符
  17. }
  18. }

2.从数据库查询认证,创建一个实现类,通过实现userDetailsService接口,重写里面的loadUserByUsername(String s)方法,当用户点击登录时,此方法的参数会将当前的用户名传入,我们可通过用户名从数据库查询用户信息,将查到的用户信息保存到UserDetails对象中并返回,security框架会将返回的UserDetails对象和当前登录的用户进行认证,如果相同则登录成功。(注意密码必须是带加密的),最后在配置类里设置通过userDetailsServiceI对象验证

  1. package com.security.springSecurity.service;
  2. import org.springframework.security.core.userdetails.User;
  3. import org.springframework.security.core.userdetails.UserDetails;
  4. import org.springframework.security.core.userdetails.UserDetailsService;
  5. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  6. import org.springframework.stereotype.Service;
  7. @Service
  8. public class UserDetailsServiceImpl implements UserDetailsService {
  9. @Override
  10. public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
  11. // 通过用户名去数据库查询密码及权限
  12. String username = s;
  13. String password = "{bcrypt}$2a$10$Wg.X1U3cKklWFqiZVmIzSeDynq3LcgXRlVhBIAW0s0tmZLRd.5QWy";//123456
  14. String authorities = "abc";
  15. // 将查询到的用户名、密码、权限保存到UserDetails中,框架会自动验证,如果前端传入的和UserDetails中保存一样则会登录成功
  16. UserDetails userDetails = User
  17. .builder()
  18. .username(username)
  19. .password(password)
  20. .authorities(authorities)
  21. .build();
  22. return userDetails;
  23. }
  24. }
  1. @Configuration
  2. //启动 权限管理功能
  3. @EnableGlobalMethodSecurity( prePostEnabled = true)
  4. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  5. @Autowired
  6. private UserDetailsService userDetailsServiceImpl;
  7. // 重写配置权限的方法
  8. @Override
  9. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  10. // 通过userDetailsServiceImpl对象验证
  11. auth.userDetailsService(userDetailsServiceImpl);
  12. }

二、自定义设置请求权限:在配置类里继续重写configure(HttpSecurity http){}方法实现设置请求权限

  1. package com.security.springSecurity.config;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  5. import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
  6. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  7. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  8. import org.springframework.security.core.userdetails.UserDetailsService;
  9. @Configuration
  10. //启动 权限管理功能
  11. @EnableGlobalMethodSecurity( prePostEnabled = true)
  12. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  13. @Override
  14. protected void configure(HttpSecurity http) throws Exception {
  15. http.authorizeRequests() // 对请求进行权限设置
  16. .antMatchers( // 设置匹配路径
  17. "/index.html",
  18. "/css/*",
  19. "/js/*",
  20. "/login.html",
  21. "/login"
  22. ).permitAll() // 对以上匹配路径全部放行
  23. .anyRequest().authenticated() // 对其他请求需要认证
  24. .and().formLogin() // 没有权限会自动跳到登录页
  25. .loginPage("/login.html") // 使用自己的登录页面
  26. .loginProcessingUrl("/login") // 设置登录时表单提交的路径
  27. .failureUrl("/login.html?error")// 登录失败的路径
  28. .defaultSuccessUrl("/index.html")// 设置登录成功的页面
  29. ;
  30. http.logout() // 设置登出
  31. .logoutUrl("/logout") // 设置登出的请求路径
  32. .logoutSuccessUrl("/login.html");//登出成功后返回的页面
  33. http.csrf().disable(); //关闭防跨越攻击,最好写上不然容易报错
  34. }
  35. }

三、使用@PreAuthorize注解给Controller中的请求接口设置访问权限字符:设置后当前用户有该权限字符才能访问该路径,不然会报403权限不足。


四、在任何方法的参数上获取当前登录的用户:通过UserDetails中保存的当前登录用户获取

  1. package com.security.springSecurity.controller;
  2. import org.springframework.security.access.prepost.PreAuthorize;
  3. import org.springframework.security.core.annotation.AuthenticationPrincipal;
  4. import org.springframework.security.core.userdetails.UserDetails;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. public class TestController {
  9. //3.在请求路径的方法上加@PreAuthorize("hasAuthority('权限字符')")即可
  10. @RequestMapping("/s1")
  11. @PreAuthorize("hasAuthority('abc')")
  12. public String test01(){
  13. return "s1";
  14. }
  15. //4.在任何方法的参数上加UserDetails参数,并在参数前加@AuthenticationPrincipal注解
  16. // 此时在使用UserDetails参数就是当前登录时存入的用户
  17. @RequestMapping("/my")
  18. public String getMy(@AuthenticationPrincipal UserDetails userDetails){
  19. String username = userDetails.getUsername();
  20. return "当前用户用名是:"+username;
  21. }
  22. }

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

闽ICP备14008679号