今天给大家分享shiro授权,其实就是不过5表联查
数据库分析
首先,我们要获取登陆用户权限与角色的信息,可以进行多表联查。
根据用户名获取当前登陆用户角色信息
SQL语句
select t1.role_name from t_sys_role t1
inner join t_sys_user_role t2 on t1.role_id=t2.role_id
inner join t_sys_user t3 on t2.user_id=t3.user_id
where t3.username='zs
根据用户名获取当前登陆用户权限信息
SQL语句
select t5.permission from t_sys_user t1
inner join t_sys_user_role t2 on t1.user_id=t2.user_id
inner join t_sys_role t3 on t2.role_id=t3.role_id
inner join t_sys_role_permission t4 on t3.role_id=t4.role_id
inner join t_sys_permission t5 on t4.permission_id=t5.permission_id
where t1.username='ls'
实现代码
登陆页面
mapper.xml
注意事项:
mapper层要加注解@Repository,spring框架才会识别这个类是mapper层
Service层要加注解@Service,spring框架才会识别这个类是Service层
继承授权接口AuthorizingRealm进行用户授权、认证
/**
* 授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//获取登陆的用户名
String username = principalCollection.getPrimaryPrincipal().toString();
Set<String> roles = userService.RolesName(username);
Set<String> permission = userService.PermissionName(username);
//Reaml处理结果集,返回给安全管理器
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
//设置权限与角色
info.setRoles(roles);
info.setStringPermissions(permission);
return info;
}
Controller实现用户登陆
@Controller
public class UserController {
@RequestMapping("user/login")
public String login(User user, Model model) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(),user.getPassword());
try {
subject.login(token);
} catch (UnknownAccountException | LockedAccountException e) {
model.addAttribute("message", e.getMessage());
return "login";
} catch (AuthenticationException e) {
e.printStackTrace();
model.addAttribute("message", "密码错误");
return "login";
}
return "index";
}
}
首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="http://shiro.apache.org/tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>首页</h3>
<s:hasPermission name="bookmanager:book:add">
<li><a href="#">书本查询</a></li>
</s:hasPermission>
<s:hasPermission name="bookmanager:book:add">
<li><a href="#">书本新增</a></li>
</s:hasPermission>
<s:hasPermission name="bookmanager:book:edit">
<li><a href="#">书本修改</a></li>
</s:hasPermission>
<s:hasPermission name="system:dict:del">
<li><a href="#">书本删除</a></li>
</s:hasPermission>
<a href="<%=request.getContextPath()%>/system/dict/view">查询权限</a>
</body>
</html>
我们登陆的用户ls只有删除的权限,所以其他的不会显示在页面上。
必须要先引入标签库
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
Shiro标签库
- guest标签 :验证当前用户是否为“访客”,即未认证(包含未记住)的用户
- user标签 :认证通过或已记住的用户
- authenticated标签 :已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在
- notAuthenticated标签 :未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户
- principal 标签 :输出当前用户信息,通常为登录帐号信息
- hasRole标签 :验证当前用户是否属于该角色
- lacksRole标签 :与hasRole标签逻辑相反,当用户不属于该角色时验证通过
- hasAnyRole标签 :验证当前用户是否属于以下任意一个角色
- hasPermission标签 :验证当前用户是否拥有指定权限
- lacksPermission标签 :与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过