• Shiro简单入门


    1:关键对象

    subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份的认证.

    principal:身份信息,通常是唯一的,一个主体有多个身份信息,但是都有一个主的身份信息(primary principal)

    credential:凭证信息,可以是密码,证书,指纹。。。。

    总结:主体进行身份认证时需要提供身份信息和凭证 信息

    2:授权流程

    授权流程可以理解为: who 对what(which)资源进行how(怎样的) 操作

    who: 主体 即subject, subject在认证通过后系统进行访问控制

    what(which):资源(Resource),subject必须具备资源的访问权限才可以访问该资源.

    how:权限/许可(permission)subject对该资源有怎样的权限:如增加?删除?修改?

    3:权限模型

     最终演变成:(权限其实是针对于资源来说的)

    4:控制权限

    4-1基于角色的访问

    RBAC(role based access control)

    缺点:这种方式不利于系统维护(可扩展不强)

    4-2基于资源的访问  (建议使用这种)

    RBAC(resource based access control)

    5:粗粒度和细粒度权限

    5-1概念

    粗粒度权限管理:(页面的访问信息,仅仅能进页面,不能进行增删改查操作)对资源类型进行管理 比如:菜单, url连接, 用户添加页面, 类方法

    细粒度的权限管理:(数据级别的权限管理:如某个模块的增删改查) 对资源实例的权限管理 比如:资源类型的具体化 比如用户id为001的修改url,

    5-2如何实现粗粒度和细粒度的权限控制

    实现粗粒度: (一般使用框架来实现)

    比如:通过springMvc的拦截器实现授权(通过截取url 和数据库中拥有的权限资源做对比 没有就不会放行)

    实现细粒度:

    业务层实现控制

    6:权限框架实现权限控制 (主要用来实现控制粗粒度的权限控制)

     

    7: 不使用框架而是基于URL拦截的方式实现

         在实际开发中比较常用的方式

    8:Shiro

    入门实例

    package cn.shiro.authentication;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.config.IniSecurityManagerFactory;
    import org.apache.shiro.subject.Subject;
    import org.apache.shiro.util.Factory;
    import org.apache.shiro.mgt.SecurityManager;
    import org.junit.Test;
    
    public class AuthenticationTest {
    
        @Test
        public void testLoginAndLogout() {
            //需要创建一个securityManager工厂
            Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini");
    
            //创建一个SecurityManager
            SecurityManager securityManager = factory.getInstance();
    
            //将securityManager设置到当前运行环境中
            SecurityUtils.setSecurityManager(securityManager);
    
    
            //获取到里面穿件的subject
            Subject subject = SecurityUtils.getSubject();
            //在认证提交前准备token(令牌)
            UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111");
            //执行提交
            try {
                subject.login(token);
    
            } catch (AuthenticationException e) {
                e.printStackTrace();
            }
    
            //是否验证通过
            boolean isAuthenticated = subject.isAuthenticated();
            System.out.println(isAuthenticated);
    
            //执行退出操作
            subject.logout();
        }
    }

    坚持
  • 相关阅读:
    学到了林海峰,武沛齐讲的Day20 装饰器
    学到了林海峰,武沛齐讲的Day19 迭代细讲
    学到了林海峰,武沛齐讲的Day18 迭代
    学到了林海峰,武沛齐讲的Day18-4 文件操作
    hdu1106 java字符串分割
    hdu1282 回文数猜想
    hud1047 java大数忽略空格
    hdu1018 阶乘位数的数学原理
    hdu1715 java解大菲波数
    hdu1316 java解高精度斐波数
  • 原文地址:https://www.cnblogs.com/gaoSJ/p/12802660.html
Copyright © 2020-2023  润新知