zoukankan      html  css  js  c++  java
  • Shiro Subject设计概念

    Subject

    其拥有的行为:

           

    Subject代表着用户,用户所拥有的行为包括:登录、退出、校验权限、获得Session等,符合面向对象,门自己把自己关上了。

    Subject.Builder

    其拥有的行为:

    接口里定义了Subject具备的行为,接口里边写Builder类,Subject通过Subject.Builder创建:(new Subject.Builder()).buildSubject();

    其具备SubjectContext(拥有Subject的所有属性信息)、SecurityManager(主要职责就是创建Subject)

    该类负责SubjectContext的组装,为其设置host、session、principals等

    // 默认构造器中注入SecurityManager
    public Builder() {
        this(SecurityUtils.getSecurityManager());
    }
    
    // 创建SubjectContext
    public Builder(SecurityManager securityManager) {
        if (securityManager == null) {
            throw new NullPointerException("SecurityManager method argument cannot be null.");
        }
        this.securityManager = securityManager;
        this.subjectContext = newSubjectContextInstance();
        if (this.subjectContext == null) {
            throw new IllegalStateException("Subject instance returned from 'newSubjectContextInstance' " +
                    "cannot be null.");
        }
        this.subjectContext.setSecurityManager(securityManager);
    }
    
    protected SubjectContext newSubjectContextInstance() {
        return new DefaultSubjectContext();
    }

    组装SubjectContext

    // 为SubjectContext设置值然后返回Builder实例
    public Builder sessionId(Serializable sessionId) {
        if (sessionId != null) {
            this.subjectContext.setSessionId(sessionId);
        }
        return this;
    }
    
    public Builder host(String host) {
        if (StringUtils.hasText(host)) {
            this.subjectContext.setHost(host);
        }
        return this;
    }
    
    public Builder session(Session session) {
        if (session != null) {
            this.subjectContext.setSession(session);
        }
        return this;
    }
    
    // 使用
    Builder builder = new Subject.Builder();
    builder.sessionId("helloBuilder")
           .host("127.0.0.1");

    创建Subject,使用SecurityManager根据SubjectContext创建Subject

    public Subject buildSubject() {
        return this.securityManager.createSubject(this.subjectContext);
    }

    创建Subject的过程设计概念

    Subject$Builder.buildSubject(SubjectContext)  ==>  SecurityManager.createSubject(SubjectContext)  ==>  SubjectFactory.createSubject(SubjectContext)

  • 相关阅读:
    thinkphp的钩子的两种配置和两种调用方法
    php闭包实现函数的自调用,也是递归
    php的spl_autoload_register函数的一点个人见解
    详解js变量、作用域及内存
    关于js的call()和apply()两个函数的一点个人看法
    php实现斐波那契数列以及由此引起的联想
    php猴子称王或者约瑟夫难题
    Linux Bash Shell 快速入门
    Fedora14下首次搭建Samba服务器遇到的一些问题
    【JavaScript】我的JavaScript技术总结第一篇——编程细节
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/9319086.html
Copyright © 2011-2022 走看看