栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

七、SpringSecurity Web权限方案(3)——注解使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

七、SpringSecurity Web权限方案(3)——注解使用

一、注解使用 1.1、@Secured

用户具有某个角色,可以访问方法。另外需要注意的是这里匹配的字符串需要添加前缀ROLE_。

使用注解,先要开启注解功能!
@EnableGlobalMethodSecurity(securedEnabled = true)
在控制器方法上添加注解
给用户设置角色
测试
登录之后直接访问:http://localhost:8081/hello/testSecured
1.2、@PreAuthorize

先开启注解功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
@PreAuthorize:注解适合进入方法前的权限验证, @PreAuthorize 可以将登录用
户的 roles/permissions 参数传到方法中。
在控制器方法上添加注解
给用户设置角色

package com.xbmu.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xbmu.entity.Menu;
import com.xbmu.entity.Role;
import com.xbmu.entity.Users;
import com.xbmu.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
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.authority.SimpleGrantedAuthority;
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.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@Slf4j
public class LoginService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        QueryWrapper wrapper = new QueryWrapper<>();
        wrapper.eq("username",username);
        Users users = userMapper.selectOne(wrapper);
        // 判断用户对象是否为空
        if(null == users){
            throw new UsernameNotFoundException("用户名不存在!");
        }
        // 获取到用户角色,菜单列表
        List roles = userMapper.selectRoleByUserId(Long.valueOf(users.getId()));
        List menus = userMapper.selectMenuByUserId(Long.valueOf(users.getId()));

        // 声明一个集合
        List grantedAuthorityList = new ArrayList<>();
        // 处理角色
        for (Role role : roles){
            SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority("ROLE_".concat(role.getName()));
            grantedAuthorityList.add(simpleGrantedAuthority);
        }
        // 处理权限
        for (Menu menu : menus){
            grantedAuthorityList.add(new SimpleGrantedAuthority(menu.getPermission()));
        }

        // 将用户角色,权限添加到当前用户
        return new User(users.getUsername(),users.getPassword(),grantedAuthorityList);

    }
}

测试
使用张三账号登录

1.3、@PostAuthorize

先开启注解功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
@PostAuthorize 注解使用并不多,在方法执行后在进行权限验证,适合验证带有返回值的权限。在控制器方法上添加注解

    @RequestMapping("testPostAuthorize")
    @PostAuthorize("hasAnyAuthority('menu:system')")
    public String preAuthorize(){
        System.out.println("test--PostAuthorize");
        return "PostAuthorize";
    }

测试
1.4、@PostFilter

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

在控制器方法上添加注解

    @RequestMapping("getAll")
    @PostFilter("filterObject.username=='admin1'")
    public List getAllUser(){
        List list = new ArrayList<>();
        list.add(new Users(1,"admin1","666"));
        list.add(new Users(2,"admin2","888"));
        return list;
    }

测试
留下用户名是 admin1 的数据
1.5、@PreFilter

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

给控制器方法增加注解

    @RequestMapping("getTestPreFilter")
    @PreFilter(value = "filterObject.id%2==0")
    public List getTestPreFilter(@RequestBody List list){
        list.forEach(t-> {
            System.out.println(t.getId()+"t"+t.getUsername());
        });
        return list;
    }

测试
使用postman测试

[{
		"id": "1",
		"username": "admin",
		"password": "666"
	},
	{
		"id": "2",
		"username": "admins",
		"password": "888"
	},
	{
		"id": "3",
		"username": "admins11",
		"password": "11888"
	},
	{
		"id": "4",
		"username": "admins22",
		"password": "22888"
	}
]

允许结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/708623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号