Spring-shiro-Boot-10 shiro项目中的权限控制实例

本文通过Spring Boot结合Shiro实现权限控制,包括前端permissions权限展示和后端permissions控制。用户列表展示中,前端获取并判断用户权限;用户新增操作,后端进行权限验证,涉及授权方式如编程式、注解式、标签式,通过Realm实现Authorizer进行判断,并对用户角色和权限进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以user模块来实现shiro中的权限控制。

一、用户列表展示-----前端进行permissions权限控制

(1) 前端:获取用户当前权限

function checkPermission() {
	var pers = [];
	$.ajax({
		type : 'get',
		url : '/permissions/owns',
		contentType : "application/json; charset=utf-8",
		async : false,
		success : function(data) {
			pers = data;
			$("[permission]").each(function() {
				var per = $(this).attr("permission");
				if ($.inArray(per, data) < 0) {
					$(this).hide();
				}
			});
		}
	});
	
	return pers;
}

(2)前端:判断当前权限

var edit = buttonEdit(href, "sys:user:add", pers);

function buttonEdit(href, permission, pers){
	if(permission != ""){
		if ($.inArray(permission, pers) < 0) {
			return "";
		}
	}
	...
}

二、用户新增-----后端进行permissions权限控制

(1)准备好用户参数、权限参数等,发起表单提交。【POST】

            var formdata = $("#form").serializeObject();
		    formdata.roleIds = getCheckedRoleIds();


			$.ajax({
				type : 'post',
				url : '/users',
				contentType: "application/json; charset=utf-8",  
				data : JSON.stringify(formdata),
				success : function(data) {
					layer.msg("添加成功", {shift: -1, time: 1000}, function(){
                        location.href = "userList.html";
                    });
				}
			});

(2)转换为Dto

//#######UserDto######### 

public class UserDto extends User {

	private static final long serialVersionUID = -184009306207076712L;

	private List<Long> roleIds;

	public List<Long> getRoleIds() {
		return roleIds;
	}

	public void setRoleIds(List<Long> roleIds) {
		this.roleIds = roleIds;
	}

}

//#######User #########

public class User extends BaseEntity<Long> {

	private static final long serialVersionUID = -6525908145032868837L;

	private String username;
	private String password;
	@JsonIgnore
	private String salt;
	private String nickname;
	private String headImgUrl;
	private String phone;
	private String telephone;
	private String email;
	@JsonFormat(pattern = "yyyy-MM-dd")
	private Date birthday;
	private Integer sex;
	private Integer status;	
   
    public interface Status {
		int DISABLED = 0;
		int VALID = 1;
		int LOCKED = 2;
	}

}

(3)获取参数,进行权限验证

    @LogAnnotation
	@PostMapping
	@ApiOperation(value = "保存用户")
	@RequiresPermissions("sys:user:add")
	public User saveUser(@RequestBody UserDto userDto) {
		User u = userService.getUser(userDto.getUsername());
		if (u != null) {
			throw new IllegalArgumentException(userDto.getUsername() + "已存在");
		}

		return userService.saveUser(userDto);
	}

参数传递没什么好说的,重点看权限验证,也就是

@RequiresPermissions("sys:user:add")

这里想说一下shiro的授权方式:一共有三种。一种是编程式。一种是注解式。一种是标签式。无论是哪一种方式,相应的Realm实现Authorizer 都会进行判断。

//编程式
Subject subject = SecurityUtils.getSubject(); 
if(subject.hasRole(“admin”)) 
{ //有权限 } 
else 
{ //无权限 }



//注解式
@RequiresRoles("admin") 
public void hello() 
{ //有权限 }



//标签式
<shiro:hasRole name="admin"> 
<!— 有权限—> 
</shiro:hasRole>

(4)shiro权限控制

主要做以下几点,获取当前用户的角色和权限;将其放入session;将其放入authorizationInfo;

具体代码如下:

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
		log.debug("权限配置");

		SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
		User user = UserUtil.getCurrentUser();
		//获取当前用户对应的角色ids
		List<Role> roles = SpringUtil.getBean(RoleDao.class).listByUserId(user.getId());
		//获取当前用户对应的角色names
		Set<String> roleNames = roles.stream().map(Role::getName).collect(Collectors.toSet());
		
        //一、authorizationInfo设置角色
		authorizationInfo.setRoles(roleNames);
		//获取当前用户对应的权限permissions
		List<Permission> permissionList = SpringUtil.getBean(PermissionDao.class).listByUserId(user.getId());
		//为当前用户设置权限,放到session中
		UserUtil.setPermissionSession(permissionList);
		Set<String> permissions = permissionList.stream().filter(p -> !StringUtils.isEmpty(p.getPermission()))
				.map(Permission::getPermission).collect(Collectors.toSet());
		
        
        //二、authorizationInfo设置权限
		authorizationInfo.setStringPermissions(permissions);

		return authorizationInfo;

	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良之才-小良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值