当前位置:   article > 正文

配置基于数据库的认证信息和角色授权(SpringBoot整合SpringSecurity)_configure(authenticationmanagerbuilder auth)

configure(authenticationmanagerbuilder auth)

配置基于数据库的认证信息和角色授权

1.首先导入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.5.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>8.0.30</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.baomidou</groupId>
  14. <artifactId>mybatis-plus-boot-starter</artifactId>
  15. <version>3.4.1</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.alibaba</groupId>
  19. <artifactId>druid</artifactId>
  20. <version>1.2.6</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-data-jdbc</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-jdbc</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-security</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.security</groupId>
  36. <artifactId>spring-security-test</artifactId>
  37. <scope>test</scope>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-web</artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-test</artifactId>
  46. <scope>test</scope>
  47. </dependency>

 依赖要找正确,否则在写代码的时候是找不到关键字的,并且会一路爆红

2.编写用户实体类和角色实体类

  1. @Data
  2. @TableName("userlist")
  3. public class userpojo {
  4. @TableId(value = "id",type = IdType.AUTO)
  5. private Integer id;
  6. @TableField(value = "username")
  7. private String username;
  8. @TableField(value = "password")
  9. private String password;
  10. @TableField(value = "role")
  11. private String role;
  12. }
  13. @Data
  14. @TableName("rolelist")
  15. public class rolepojo {
  16. @TableId(value = "id",type = IdType.AUTO)
  17. private Integer id;
  18. @TableField(value = "role")
  19. private String role;
  20. @TableField(value = "permisssion")
  21. private String permission;
  22. }

@TableName 注解用来将指定的数据库表和 JavaBean 进行映射

@TableId注解是专门用在主键上的注解,如果数据库中的主键字段名和实体中的属性名不一样,可以在实体中表示主键的属性上加@Tableid注解,并指定@Tableid注解的value属性值为表中主键的字段名既可以对应上。

@TableField注解可以指定字段的一些属性,避免不一致导致登陆出错,常常解决的问题有两个:
1.对象中的属性名和表中的字段名不一致(非驼峰)
2.对象中的属性字段在表中不存在

3.编写userMapper接口确定sql语句通过用户名来查询用户信息

  1. @Repository
  2. public interface userDao extends BaseMapper<userpojo> {
  3. }
  4. @Repository
  5. public interface roleDao extends BaseMapper<rolepojo> {
  6. }

 @Repositoy该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。

这里就可以不用写一些SQL语句了,因为有BaseMapper<>

4.创建 UserDetailsService 的实现类,编写自定义认证逻辑

  1. @Service
  2. public class userServiceImpl implements UserDetailsService {
  3. @Autowired
  4. userDao userDao;
  5. @Autowired
  6. roleDao roleDao;
  7. @Override
  8. public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
  9. //自定义认证逻辑
  10. QueryWrapper<userpojo> queryWrapper = new QueryWrapper<>();
  11. queryWrapper.eq("username", s);
  12. //查询用户
  13. userpojo user= userDao.selectOne(queryWrapper);
  14. // 判断用户是否存在
  15. if (user == null) {
  16. throw new UsernameNotFoundException("用户名不存在");
  17. }
  18. else {
  19. List<SimpleGrantedAuthority> authorities = new ArrayList<>();
  20. QueryWrapper<rolepojo> queryWrapper1 = new QueryWrapper<>();
  21. queryWrapper1.eq("role", user.getRole());
  22. List<rolepojo> rolepojos=roleDao.selectList(queryWrapper1);
  23. rolepojos.forEach(role -> {
  24. authorities.add(new SimpleGrantedAuthority(role.getPermission()));
  25. });
  26. return new User(user.getUsername(), user.getPassword(), authorities);
  27. }
  28. }
  29. }

 我这里实现了自定义认证逻辑,最重要的是else里面的内容,如果role.getPermission()不通过,那么就没有权限允许连接

5.编写SecurityConfig配置类

  1. @Configuration //指明是配置类
  2. @EnableWebSecurity//开启Spring Security的功能
  3. @EnableGlobalMethodSecurity(prePostEnabled=true)
  4. //prePostEnabled属性决定Spring Security在接口前注解是否可用@PreAuthorize,@PostAuthorize等注解,设置为true,会拦截加了这些注解的接口
  5. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  6. @Autowired
  7. userServiceImpl userService;
  8. /**
  9. *
  10. * @param http
  11. * @throws Exception
  12. */
  13. @Override
  14. protected void configure(HttpSecurity http) throws Exception{
  15. http
  16. .authorizeRequests()
  17. .mvcMatchers("/").permitAll()
  18. .mvcMatchers("/hello").hasAuthority("world")
  19. .mvcMatchers("/welcome").hasAuthority("family")
  20. .anyRequest().authenticated();
  21. http.formLogin();
  22. }
  23. /**
  24. *
  25. * @param auth
  26. * @throws Exception
  27. */
  28. @Override
  29. protected void configure(AuthenticationManagerBuilder auth) throws Exception{
  30. auth.userDetailsService(userService)
  31. .passwordEncoder(passwordEncoder());
  32. }
  33. /**
  34. * 加密
  35. * @return
  36. */
  37. @Bean
  38. public PasswordEncoder passwordEncoder(){
  39. return NoOpPasswordEncoder.getInstance();
  40. }
  41. }

 注意我这里URL路径匹配,一个是hello一个是welcome,还有注意hasAuthority里面的内容对照着rolelist里面的permission,如果这两个对不上,就不允许进入,比如我走localhost:8080/hello,

会出现

 直接403,拒接访问

 6.创建一个数据库,在数据库中创建两张表

7.准备数据库连接,在application.properties文件中写

  1. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  2. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/securitylist?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
  3. spring.datasource.password=1234
  4. spring.datasource.username=root

 这里连接数据库的时候要注意书写,不要一下直接创建,看清楚,我就是把spring.datasourse.username写成spring.datasourse,name,报了两个错误,折腾了半天,查找了很多资料,但是都没用,哈哈

8.随便写个DemoController

  1. @RestController
  2. public class DemoControlller {
  3. @RequestMapping("/hello")
  4. public static String hello(){
  5. return "hello world!";
  6. }
  7. @RequestMapping("/welcome")
  8. public static String welcome(){
  9. return "welcome family";
  10. }
  11. }

 通过路径访问就能得到返回的内容

9.结果展示

 我专门设置了权限,只有welcome能够得返回值,hello就是403拒绝访问

关于遇到的问题,在这里展示一下,希望下一次有所方案

1.首先是依赖的问题

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.5.6</version>
  5. </dependency>

它爆红,我遇到这两种:无法解析 org.springframework.boot:spring-boot-maven-plugin:2.5.6

Could not find artifact org.springframework.boot:spring-boot-starter-parent:jar:2.5.6 in alimaven

我把网上的解决方法试了一下
1.检查Maven的配置,查看Maven配置是否正确,根据所需查看内容是否存在,在本地仓库里面去找

2.尝试更改阿里云镜像,将用户设置文件路径中的settings.xml用可编辑的软件打开,进行修改,我用的是

3更换依赖的版本号,慢慢去尝试找正确的,可能有用 

2.紧接着是mysql数据库的连接问题

一定要是

  1. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  2. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/securitylist?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
  3. spring.datasource.password=1234
  4. spring.datasource.username=root

我原本写的是spring.datasourse.name,报了很多错误,在这里展示一下

 出现这些错误时,

我以为是用户权限的问题,没有远程访问权限时出现这个问题,刚刚安装的myql的root密码账号只有localhost的操作权限,我进行了这种尝试
1、mysql -u root -p 登陆进MYSQL;

2、执行以下命令:

GRANT ALL on securitylist.* to 'root'@'localhost' identified by '1234' with grant option;

其中securitylist是数据库名,root是用户,1234是密码

3.刷新权限

FLUSH PRIVILEGES;

但是都没什么用处,遇到这种问题就先去查看你连接数据库的配置文件四个内容是否书写正确

结语

写代码配置数据库时,一定要仔细啊!

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

闽ICP备14008679号