Spring Boot 整合 Shiro 之后可以认证,不能授权的问题
问题不一定适合所有人,但可能会适合你。
直接说解决方案:
原因:网上copy代码,创建多Realm
的自定义ShiroConfig类的时候代码中只给Authenticator
注入Realms
没有给Authorizer
注入Realm
代码改成如下就可以了
package cn.com.springbootshiro.common.config.shiro;
import java.util.*;
import org.apache.shiro.authc.Authenticator;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.authz.Authorizer;
import org.apache.shiro.authz.ModularRealmAuthorizer;
import cn.com.springbootshiro.common.config.shiro.ream.UserRealm;
//省略部分无关代码
@Configuration
@Log4j
public class ShiroConfig {
@Bean("authorizer")
public Authorizer authorizer(Realm ...realms) {
ModularRealmAuthorizer authenticator = new ModularRealmAuthorizer();
Collection<Realm> crealms = new ArrayList<>(realms.length);
for(Realm oneRealm:realms){
crealms.add(oneRealm);
}
authenticator.setRealms(crealms );
return authenticator;
}
@Bean("authenticator")
public Authenticator authenticator(Realm ...realms) {
ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
Collection<Realm> crealms = new ArrayList<>(realms.length);
for(Realm oneRealm:realms){
crealms.add(oneRealm);
}
authenticator.setRealms(crealms );
return authenticator;
}
//省略部分无关代码
@Bean
public DefaultWebSecurityManager securityManager(Authenticator authenticator,Authorizer authorizer) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setAuthenticator(authenticator);// 认证 set realms
securityManager.setAuthorizer(authorizer);// 授权 set realms
securityManager.setCacheManager(cacheManager());
return securityManager;
}
}
解释:
之前不走授权流程是因为你的Authenticator
有Realm信息但Authorizer
中没有Realm信息,授权的时候,需要从Authorizer
中获取Realm,得不到,怎么可能走你的授权流程。
注意:Authorizer
和Authenticator
很相似,很多和他们有关的方法/类名都很相似,所以一定要注意。