zoukankan      html  css  js  c++  java
  • Shiro 笔记

    功能

    • 认证

    • 授权

    • 加密

    • session 管理

    认证

    Subject 是一个与系统交互的实体,可以是人,也可以是其他等

    调用 SecurityUtils.getSubject()返回当前Subject,即当前用户

    // 创建 Realm
    IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
    // 将 Realm 给 SecurityManager
    SecurityManager securityManager = new DefaultSecurityManager(iniRealm);
    ​
    // 将 SecurityManager 赋值给 SecurityUtils
    SecurityUtils.setSecurityManager(securityManager);
    // 获取当前 Subject (当前用户)
    Subject currentUser = SecurityUtils.getSubject();
    ​
    // 判断是否认证
    if (! currentUser.isAuthenticated()) {
        // 要进行登录的 Token
        UsernamePasswordToken token = new UsernamePasswordToken("name", "password");
        token.setRememberMe(true);
        try {
            // 登录-使用 Realm 校验要登录的 Token
            currentUser.login(token);
        } catch (UnknownAccountException uae) {
            log.error("Username Not Found!", uae);
        } catch (IncorrectCredentialsException ice) {
            log.error("Invalid Credentials!", ice);
        } catch (LockedAccountException lae) {
            log.error("Your Account is Locked!", lae);
        } catch (AuthenticationException ae) {
            log.error("Unexpected Error!", ae);
        }
    }

    Realm 配置文件

    [users]
    user = password, admin
    user2 = password2, editor
    ​
    [roles]
    admin = *
    editor = articles:*

    授权

    对用户赋予指定的角色,每个角色有特定的权限

    // 判断用户是否有特定角色
    if (currentUser.hasRole("admin")) {
        log.info("Welcome Admin");
    } else if (currentUser.hasRole("editor")) {
        log.info("Welcomt Editor");
    } else {
        log.info("Welcome Guest");
    }
    // 判断当前用户是否有特定权限
    if (currentUser.isPermitted("articles:compose")) {
        log.info("You can compose an article");
    } else {
        log.info("You are not permitted to compose an article!");
    }

    Realm 配置

    Realm 是一个 DAO,用来保存用户认证和授权所需要的信息,它可以来自文件也可以来自数据库等

    要创建一个 Realm,只需要实现 Realm 接口,框架中有已经实现的 JdbcRealm,可以继承它,覆写下面的方法

    doGetAuthenticationInfo()doGetAuthorizationInfo()getRoleNamesForUser()getPermissions()

    之后可以与之前IniRealm同样使用

    登出

    currentUser.logout();

    Session 管理

    如果在 Web 环境下,默认使用HttpSession实现,在独立桌面应用中也可使用

    Session session = currentUser.getSession();
    session.setAttribute("key", "value");
    String value = (String) session.getAttribute("key");
    if (val.equals("value")) {
        log.info("Retrieved the correct value! [" + vallue + "]");
    }

    集成到 SpringBoot

    maven 依赖:

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.4.0</version>
    </dependency>

    下面需要配置 Realm 与 Shiro security filters

    @Bean
    public Realm realm() {
        return new MyCustomRealm();
    }
         
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition filter
          = new DefaultShiroFilterChainDefinition();
     
        filter.addPathDefinition("/secure", "authc");
        filter.addPathDefinition("/**", "anon");
     
        return filter;
    }

    参考文献

  • 相关阅读:
    MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
    MongoDB-Java的两个基本操作Upsert和insertMany
    MongoDB With Spark遇到的2个错误,不能初始化和sample重复的key
    mongoDB启动前的系统设置,解决部分Warning问题
    使用commons-compress解压GBK格式winzip文件到UTF8,以及错误使用ZipArchiveInputStream读出来数据全是空的解决办法
    mongodb查看操作记录方法以及用户添加删除权限修改密码
    java及spark2.X连接mongodb3.X单机或集群的方法(带认证及不带认证)
    MongoDB3.X单机及shading cluster集群的权限管理(基于3.4.5)
    element ui form表单清空规则
    input type file上传文件之后清空内容。
  • 原文地址:https://www.cnblogs.com/zawier/p/9236892.html
Copyright © 2011-2022 走看看