//1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory(configFile); //2、得到SecurityManager实例 并绑定给SecurityUtils org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); SecurityUtils.setSecurityManager(securityManager)源码: * * *设置一个VM(静态)单例SecurityManager,专门用于透明使用 * {@link #getSubject() getSubject()}实现。 * < p / > * <b>此方法调用主要用于框架开发支持。应用程序开发人员很少, *如果需要,需要调用这个方法。</b> * < p / > Shiro开发团队更喜欢SecurityManager实例是非静态的单例应用程序 *和<em>不是</em> VM静态单例。不使用静态内存的应用程序单例需要一些排序 *应用程序配置框架,为您维护应用程序范围的SecurityManager实例 *(例如,Spring或EJB3环境),这样对象引用就不需要是静态的。 * < p / > 在这些环境中,Shiro通过自己的线程根据当前正在执行的线程获取主题数据 *框架集成代码,这是使用Shiro的首选方式。 * < p / > *然而在一些环境中,例如一个独立的桌面应用程序或applet不使用Spring或 * EJB或类似的配置框架,VM-singleton可能更有意义(尽管前者仍然是首选)。 *在这些环境中,通过此方法设置SecurityManager将自动启用 * {@link #getSubject() getSubject()}调用函数,配置很少。 * < p / > *例如,在这些环境中,这将工作: * <前> * DefaultSecurityManager securityManager = new {@link org.apache.shiro.mgt。DefaultSecurityManager DefaultSecurityManager} (); * securityManager。setRealms (…);//一个或多个域 * < b > SecurityUtils。setSecurityManager (securityManager); < / b > < / pre > * < p / > *然后在应用程序代码的任何地方,下面的调用将返回应用程序的主题: * <前> * currentUser = securityutil . getsubject ();</pre> * * @param securityManager将securityManager实例设置为一个VM静态单例。 * / public void setSecurityManager(SecurityManager SecurityManager) { SecurityUtils。securityManager = securityManager; } //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证) Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); UsernamePasswordToken(username, password):源码: / * * *构造一个新的UsernamePasswordToken,封装提交的用户名和密码 *在验证过程中,使用<tt>null</tt> {@link #getHost() host}和 * a <tt>remember berme </tt> default <tt>false</tt> * < p / > * <p>这是一个方便的构造函数,通过一个字符在内部维护密码 * array,即<tt>password.toCharArray();注意,将密码存储为字符串 *在您的代码中可能存在安全隐患,如类JavaDoc.</p>中所述 * 提交认证的用户名 提交用于身份验证的密码字符串 * / public UsernamePasswordToken(final String username, final String password) { this(username, password != null ? password.toCharArray() : null, false, null); } subject.login(token):源码: / * * *为该主题/用户执行一次登录尝试。 如果不成功, 抛出{@link AuthenticationException},它的子类表示尝试失败的原因。 *如果成功,与提交的主体/凭证相关联的帐户数据将是 *与这个{@code Subject}相关联,该方法将悄悄地返回。 * < p / > *静悄悄返回后,可以考虑这个{@code Subject}实例 * authenticated和{@link #getPrincipal() getPrincipal()}将是非空的 * {@link #isAuthenticated() isAuthenticated()}将是{@code true}。 * * @param令牌该令牌封装了要传递给的主题的主体和凭据 *验证子系统。 * @throws org.apache.shiro.authc.AuthenticationException *如果身份验证尝试失败。 * @since 0.9 * / void login(AuthenticationToken token) throws AuthenticationException;
来源:https://www.cnblogs.com/wangbiaohistory/p/12643185.html