• 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进行用户授权、认证

    1. /**
    2. * 授权
    3. * @param principalCollection
    4. * @return
    5. */
    6. @Override
    7. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    8. //获取登陆的用户名
    9. String username = principalCollection.getPrimaryPrincipal().toString();
    10. Set roles = userService.RolesName(username);
    11. Set permission = userService.PermissionName(username);
    12. //Reaml处理结果集,返回给安全管理器
    13. SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
    14. //设置权限与角色
    15. info.setRoles(roles);
    16. info.setStringPermissions(permission);
    17. return info;
    18. }

    Controller实现用户登陆        

     

    1. @Controller
    2. public class UserController {
    3. @RequestMapping("user/login")
    4. public String login(User user, Model model) {
    5. Subject subject = SecurityUtils.getSubject();
    6. UsernamePasswordToken token = new UsernamePasswordToken(user.getUserName(),user.getPassword());
    7. try {
    8. subject.login(token);
    9. } catch (UnknownAccountException | LockedAccountException e) {
    10. model.addAttribute("message", e.getMessage());
    11. return "login";
    12. } catch (AuthenticationException e) {
    13. e.printStackTrace();
    14. model.addAttribute("message", "密码错误");
    15. return "login";
    16. }
    17. return "index";
    18. }
    19. }

    首页

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@taglib prefix="s" uri="http://shiro.apache.org/tags" %>
    3. <html>
    4. <head>
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <h3>首页h3>
    9. <s:hasPermission name="bookmanager:book:add">
    10. <li><a href="#">书本查询a>li>
    11. s:hasPermission>
    12. <s:hasPermission name="bookmanager:book:add">
    13. <li><a href="#">书本新增a>li>
    14. s:hasPermission>
    15. <s:hasPermission name="bookmanager:book:edit">
    16. <li><a href="#">书本修改a>li>
    17. s:hasPermission>
    18. <s:hasPermission name="system:dict:del">
    19. <li><a href="#">书本删除a>li>
    20. s:hasPermission>
    21. <a href="<%=request.getContextPath()%>/system/dict/view">查询权限a>
    22. body>
    23. 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标签逻辑相反,当前用户没有制定权限时,验证通过
  • 相关阅读:
    Markdown 1 - 图文音视频等
    软件流程和管理(二):Agile
    基于kubernetes CI/CD实践
    1016 Phone Bills
    Mybatis与Spring的集成
    Vue3 Vite electron 开发桌面程序
    速查!PMP考试成绩已出!
    北大肖臻老师《区块链技术与应用》系列课程学习笔记[22]以太坊-智能合约-2
    【JAVA】Spring(中)注解开发&整合Mybatis&整合JUnit
    【Altium Designer21】输出GERBER文件
  • 原文地址:https://blog.csdn.net/Bugxiu_fu/article/details/126796877