当前位置: 代码迷 >> 综合 >> No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util....
  详细解决方案

No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util....

热度:65   发布时间:2023-12-12 20:41:54.0

spring boot  搭建 shiro 框架报错

配置报错,然后以下有关shiro的配置都写好的情况下:

public class ShiroConfiguration {/*** Shiro的Web过滤器Factory 命名:shiroFilter*/@Bean(name = "shiroFilter")public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();//Shiro的核心安全接口,这个属性是必须的shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, Filter> filterMap = new LinkedHashMap<>();filterMap.put("authc", new AjaxPermissionsAuthorizationFilter());shiroFilterFactoryBean.setFilters(filterMap);/*定义shiro过滤链  Map结构* Map中key(xml中是指value值)的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的* anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种* authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter*/Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();/* 过滤链定义,从上向下顺序执行,一般将 / ** 放在最为下边:这是一个坑呢,一不小心代码就不好使了;authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问 */filterChainDefinitionMap.put("/", "anon");filterChainDefinitionMap.put("/static/**", "anon");filterChainDefinitionMap.put("/login/auth", "anon");filterChainDefinitionMap.put("/login/logout", "anon");filterChainDefinitionMap.put("/error", "anon");filterChainDefinitionMap.put("/**", "authc");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}/*** 不指定名字的话,自动创建一个方法名第一个字母小写的bean*/@Bean(name = "securityManager")public SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(userRealm());return securityManager;}/*** Shiro Realm 继承自AuthorizingRealm的自定义Realm,即指定Shiro验证用户登录的类为自定义的*/@Beanpublic UserRealm userRealm() {UserRealm userRealm = new UserRealm();return userRealm;}/*** 凭证匹配器* (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了* 所以我们需要修改下doGetAuthenticationInfo中的代码;* )* 可以扩展凭证匹配器,实现 输入密码错误次数后锁定等功能,下一次*/@Bean(name = "credentialsMatcher")public HashedCredentialsMatcher hashedCredentialsMatcher() {HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();//散列算法:这里使用MD5算法;hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列的次数,比如散列两次,相当于 md5(md5(""));hashedCredentialsMatcher.setHashIterations(2);//storedCredentialsHexEncoded默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码hashedCredentialsMatcher.setStoredCredentialsHexEncoded(true);return hashedCredentialsMatcher;}/*** Shiro生命周期处理器*/@Beanpublic LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {return new LifecycleBeanPostProcessor();}/*** 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证* 配置以下两个bean(DefaultAdvisorAutoProxyCreator(可选)和AuthorizationAttributeSourceAdvisor)即可实现此功能*/@Bean@DependsOn({"lifecycleBeanPostProcessor"})public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();advisorAutoProxyCreator.setProxyTargetClass(true);return advisorAutoProxyCreator;}@Beanpublic AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());return authorizationAttributeSourceAdvisor;}
}

 

我漏了一个注解    @Configuration  。。。。

 

@Configuration       
public class ShiroConfiguration {
   

 

 问题解决~

  相关解决方案