SpringSecurity认证授权的注解使用

举报
别团等shy哥发育 发表于 2023/02/04 16:45:25 2023/02/04
【摘要】 @toc 1、@Secured注解判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。 1.1 启动类开启注解使用注解先要开启注解功能!先在启动类上加如下注解@EnableGlobalMethodSecurity(securedEnabled=true) 1.2 在controller的方法上面使用注解,设置角色 @GetMapping("update") @...

@toc

1、@Secured注解

判断是否具有角色,另外需要注意的是这里匹配的字符串需要添加前缀“ROLE_“。

1.1 启动类开启注解

使用注解先要开启注解功能!先在启动类上加如下注解

@EnableGlobalMethodSecurity(securedEnabled=true)

1.2 在controller的方法上面使用注解,设置角色

 @GetMapping("update")
    @Secured({"ROLE_sale","ROLE_manager"})
    public String update(){
        System.out.println("update......");
        return "hello update";
    }

1.3 userDetailService设置用户角色

关键代码:
在这里插入图片描述
完整代码如下:userDetailService.java

package com.atguigu.springsecuritydemo1.service;

import com.atguigu.springsecuritydemo1.entity.Users;
import com.atguigu.springsecuritydemo1.mapper.UsersMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("userDetailsService")
public class MyUserDetailService implements UserDetailsService {

    @Autowired
    private UsersMapper usersMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //调用userMapper中的方法,根据用户名查询数据库
        QueryWrapper<Users> wrapper=new QueryWrapper<>();//条件构造器
        //where username=?
        wrapper.eq("username",username);
        Users users= usersMapper.selectOne(wrapper);
        //判断
        if(users==null){    //数据库没有用户名,认证失败
            throw new UsernameNotFoundException("用户名不存在!");
        }

        List<GrantedAuthority> auths= AuthorityUtils.commaSeparatedStringToAuthorityList("admins,ROLE_sale");
        //从查询数据库返回user对象,得到用户名和密码,返回
        return new User(users.getUsername(),new BCryptPasswordEncoder().encode(users.getPassword()),auths);
    }

}

1.4 启动测试

项目启动后,访问http://localhost:8111/test/update
在这里插入图片描述
输入 lucy 123
在这里插入图片描述
控制台信息:
在这里插入图片描述

2、@PreAuthorize注解

@PreAuthorize:注解适合进入方法前的权限验证, @PreAuthorize 可以将登录用户的 roles/permissions 参数传到方法中。

2.1 开启注解功能

@EnableGlobalMethodSecurity(prePostEnabled = true)

2.2 在controller的方法上添加注解

 	@GetMapping("update")
    @PreAuthorize("hasAnyAuthority('admins')")
    public String update(){
        System.out.println("update......");
        return "hello update";
    }

3、@PostAuthorize注解

先开启注解功能:

@EnableGlobalMethodSecurity(prePostEnabled = true)

@PostAuthorize 注解使用并不多,在方法执行后再进行权限验证,适合验证带有返回值的权限.

4、@PostFilter注解

@PostFilter :权限验证之后对数据进行过滤
表达式中的 filterObject 引用的是方法返回值 List 中的某一个元素

    @GetMapping("getAll")
    @PostAuthorize("hasAnyAuthority('admins')")
    @PostFilter("filterObject.username == 'admin1'")
    public List<Users> getAllUser(){
        ArrayList<Users> list = new ArrayList<>();
        list.add(new Users(11,"admin1","6666"));
        list.add(new Users(21,"admin2","888"));
        System.out.println(list);
        return list;
    }

上面代码只留下用户名是 admin1 的数据

5、@PreFilter注解

@PreFilter: 进入控制器之前对数据进行过滤

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。