• Spring Boot、Spring Security登录认证及权限问题



    目录

    一、登录验证

    1.自定义密码账号

    Ⅰ.引入依赖

    Ⅱ. XxxApplication启动类

    Ⅲ. 在application.yml文件中自定义

    Ⅳ.启动项目

    2.从数据库中查找账号和密码 

    Ⅰ.引入依赖

    Ⅱ. application.yml文件

    Ⅲ. bean包的操作

    Ⅳ. service层

    Ⅴ.config配置类 

    Ⅵ.启动项目

    二、权限问题

    1.config类

    2.bean包

    3.service层

    4.启动项目


    一、登录验证

    1.自定义密码账号

    Ⅰ.引入依赖

    先搭建好一个SpringBoot框架,在基础上引入依赖

    1. <!--web-->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. <version>2.7.1</version>
    6. </dependency>
    7. <!--小辣椒-->
    8. <dependency>
    9. <groupId>org.projectlombok</groupId>
    10. <artifactId>lombok</artifactId>
    11. <version>1.18.24</version>
    12. </dependency>
    13. <!--spring security-->
    14. <dependency>
    15. <groupId>org.springframework.boot</groupId>
    16. <artifactId>spring-boot-starter-security</artifactId>
    17. </dependency>

    Ⅱ. XxxApplication启动类

    1. @SpringBootApplication
    2. public class DemoApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(DemoApplication.class,args);
    5. }
    6. }

    Ⅲ. 在application.yml文件中自定义

    1. spring:
    2. security:
    3. user:
    4. name: porsche
    5. password: 911

    Ⅳ.启动项目

    运行项目,在网页中输入账号密码。

    2.从数据库中查找账号和密码 

    Ⅰ.引入依赖

    1. <!--mysql连接-->
    2. <dependency>
    3. <groupId>mysql</groupId>
    4. <artifactId>mysql-connector-java</artifactId>
    5. </dependency>
    6. <!--mybatis plus-->
    7. <dependency>
    8. <groupId>com.baomidou</groupId>
    9. <artifactId>mybatis-plus-boot-starter</artifactId>
    10. <version>3.5.1</version>
    11. </dependency>
    12. <!--druid-->
    13. <dependency>
    14. <groupId>com.alibaba</groupId>
    15. <artifactId>druid-spring-boot-starter</artifactId>
    16. <version>1.2.9</version>
    17. </dependency>

    Ⅱ. application.yml文件

    1. server:
    2. port: 8080
    3. spring:
    4. datasource:
    5. driver-class-name: com.mysql.cj.jdbc.Driver
    6. username: bjwl
    7. password: bjwl
    8. url: jdbc:mysql://192.168.1.118:3306/book_store?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    9. type: com.alibaba.druid.pool.DruidDataSource
    10. mybatis-plus:
    11. configuration:
    12. map-underscore-to-camel-case: false
    13. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    Ⅲ. bean包的操作

    实体类:

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @TableName("user")
    5. public class Users implements Serializable {
    6. private Integer id;
    7. private String userName;
    8. private String passWord;
    9. private String nickName;
    10. private Integer state;
    11. }

    LoginUsers类:

    1. @AllArgsConstructor
    2. @NoArgsConstructor
    3. public class LoginUsers implements UserDetails {
    4. private Users users;
    5. //返回当前用户的所有权限
    6. public Collection<? extends GrantedAuthority> getAuthorities() {
    7. return users.getList();
    8. }
    9. //返回密码
    10. public String getPassword() {
    11. return users.getPassWord();
    12. }
    13. //返回用户名
    14. public String getUsername() {
    15. return users.getUserName();
    16. }
    17. @Override
    18. public boolean isAccountNonExpired() {
    19. return true;
    20. }
    21. @Override
    22. public boolean isAccountNonLocked() {
    23. return true;
    24. }
    25. @Override
    26. public boolean isCredentialsNonExpired() {
    27. return true;
    28. }
    29. @Override
    30. public boolean isEnabled() {
    31. return true;
    32. }
    33. }

    Ⅳ. service层

    1. // 是SpringSecurity的业务类,负责实现认证和授权
    2. @Service
    3. public class UsersService implements UserDetailsService {
    4. @Resource
    5. private UsersMapper mapper;
    6. @Override
    7. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    8. QueryWrapper<Users> wrapper = new QueryWrapper<>();
    9. wrapper.eq("username", username);
    10. Users users = mapper.selectOne(wrapper);//查询一条记录
    11. if (Objects.isNull(users)) {
    12. throw new RuntimeException("用户名没有找到");
    13. }
    14. return new LoginUsers(users);
    15. }
    16. }

    Ⅴ.config配置类 

    1. /*
    2. 它是SpringSecurity的配置类
    3. */
    4. @Configuration
    5. public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    6. @Resource
    7. private UsersService usersService;
    8. @Bean
    9. public PasswordEncoder getPasswordEncoder() {
    10. return new BCryptPasswordEncoder();
    11. }
    12. //数据库的认证
    13. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    14. auth.userDetailsService(usersService).passwordEncoder(getPasswordEncoder());
    15. }
    16. }

    Ⅵ.启动项目

     此时后台也会显示出,在数据库中查询了一次

    二、权限问题

    1.config类

    在类中设置权限,和设置权限名,给1.html只开启了abc01的权限,给2.html开启了abc01和abc02的权限。

    也就是说abc01可以访问1.html和2.html,abc02只可以访问2.html

    1. protected void configure(HttpSecurity http) throws Exception {
    2. http.formLogin()
    3. .loginPage("/login.html") //登录页面设置
    4. .loginProcessingUrl("/a/lo") //登录访问路径 这里同 login.html中的action
    5. .permitAll()
    6. .and().exceptionHandling().accessDeniedPage("/403.html")
    7. .and().authorizeRequests()
    8. .antMatchers("/login.html", "/a/lo").permitAll() //设置哪些路径可以直接访问,不需要认证
    9. .antMatchers("/1.html").hasAuthority("adc01") //设置当前网页访问权限
    10. .antMatchers("/2.html").hasAnyAuthority("abc01","abc02")
    11. .anyRequest().authenticated() //所有请求都可以访问
    12. .and().csrf().disable(); //关闭csrf,csrf:跨站请求伪造
    13. }

    2.bean包

    在实体类中加入

    1. @TableField(exist = false)
    2. private List<GrantedAuthority> list;

    3.service层

    为用户设置权限名

    1. List<GrantedAuthority> list = new ArrayList<>();
    2. list.add(new SimpleGrantedAuthority("abc02"));
    3. users.setList(list);

    4.启动项目

    登录

    访问1.html

    访问2.html

     


  • 相关阅读:
    Vue2项目引入element ui的表格第一行有输入框要禁用
    陈胡:Apache SeaTunnel实现 非CDC数据抽取实践
    学生学徒作品分享——金融大模型-房屋租金价格影响因素分析与预测
    Android 界面灰化处理(特殊节日)
    大数据必学Java基础(六):程序中常见问题和编译方式
    06_快速入门案例实战之电商网站商品管理:集群健康检查,文档CRUD
    BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)
    SQL创建数据库
    [附源码]计算机毕业设计JAVA超市库存管理系统
    PMP 考试一定要报培训班吗?求靠谱培训机构,最好是自己考过的!
  • 原文地址:https://blog.csdn.net/weixin_55166132/article/details/125509739