shiro授权

今天给大家分享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标签逻辑相反,当前用户没有制定权限时,验证通过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值