项目由 SSM 迁移到 SpringBoot 过程(二)

踩坑之路

  • 配置好 shiro 之后,会报下面这样一个异常.

    No realms have been configured! One or more realms must be present

  • 检查代码之后,发现没有问题啊,已经配置了相应的 realm 加到 Spring 的 IOC 容器了,然后重新去看了一下 shiro 流程,如下图所示。
    shiro

流程如下:

  • 1、首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtils. setSecurityManager()设置;
  • 2、SecurityManager负责真正的身份验证逻辑;它会委托给Authenticator进行身份验证;
  • 3、Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现;
  • 4、Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证;
  • 5、Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问。

然后我的注入顺序是这样的:

1
2
3
4
5
6
7
8
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm());
securityManager.setAuthenticator(authenticator());
securityManager.setCacheManager(ehCacheManager());
return securityManager;
}

可以很清楚的发现流程错误,导致 SecurityManager 无法找到 Authenticator 进行身份验证,所以将设置 Authenticator 的代码提前即解决问题。

1
2
3
4
5
6
7
8
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setAuthenticator(authenticator());
securityManager.setRealm(realm());
securityManager.setCacheManager(ehCacheManager());
return securityManager;
}

踩坑感想

由于之前 Spring 是拿配置文件注入的,没有很细致的了解 shiro 的运行流程,所以导致了这次问题的出现,以后需要详细了解一个轮子的底层运行原理,这样才能更好的运用轮子,不至于出错。

坚持原创技术分享,您的支持将鼓励我继续创作!