发表于: 2018-10-19 21:13:13

1 274


今天完成的事情:

复盘项目中要用到spring boot +shiro,今天整合了一下。


1.spring boot项目搭建。

---目录结构:



2.spring boot + shiro整合。

----这里是基于spring+shiro整合的基础上改进的,这里介绍主要的配置。


①配置文件:

 



②shiro配置:用类来做。用@Configuration注解表示它是一个配置类。

----在类中具体的方法上面标明@Bean注解,就表示是被spring 管理起来了。

@Configuration
public class ShiroConfiguration {
@Bean
   public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
   }
/**
    * ShiroFilterFactoryBean 处理拦截资源文件问题。
    * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在
    * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
    *
    Filter Chain定义说明
    1、一个URL可以配置多个Filter,使用逗号分隔
    2、当设置多个过滤器时,全部验证通过,才视为通过
    3、部分过滤器可指定参数,如perms,roles
    *
    */
   @Bean
   public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){

ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

       // 必须设置 SecurityManager
       shiroFilterFactoryBean.setSecurityManager(securityManager);
       // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
       shiroFilterFactoryBean.setLoginUrl("/login");
       // 登录成功后要跳转的链接
       shiroFilterFactoryBean.setSuccessUrl("/index");
       //未授权界面;
       shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
       //拦截器.
       Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
       //自定义拦截器
       Map<String, Filter> customisedFilter = new HashMap<>();
       customisedFilter.put("url", getURLPathMatchingFilter());

       //配置映射关系
       filterChainDefinitionMap.put("/login", "anon");
       filterChainDefinitionMap.put("/index", "anon");
       filterChainDefinitionMap.put("/static/**", "anon");
       filterChainDefinitionMap.put("/config/**", "anon");
       filterChainDefinitionMap.put("/doLogout", "logout");
       filterChainDefinitionMap.put("/**", "url");
       shiroFilterFactoryBean.setFilters(customisedFilter);
       shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
       return shiroFilterFactoryBean;
   }

public URLPathMatchingFilter getURLPathMatchingFilter() {
return new URLPathMatchingFilter();
   }

@Bean
   public SecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
       //设置realm.
       securityManager.setRealm(getDatabaseRealm());
       return securityManager;
   }

@Bean
   public DataRealm getDatabaseRealm(){
DataRealm myShiroRealm = new DataRealm();
       myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
       return myShiroRealm;
   }
/**
    * 凭证匹配器
    * (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
    *  所以我们需要修改下doGetAuthenticationInfo中的代码;
    * )
    * @return
    */
   @Bean
   public HashedCredentialsMatcher hashedCredentialsMatcher(){
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();

       hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:这里使用MD5算法;
       hashedCredentialsMatcher.setHashIterations(2);//散列的次数,比如散列两次,相当于 md5(md5(""));

       return hashedCredentialsMatcher;
   }
/**
    *  开启shiro aop注解支持.
    *  使用代理方式;所以需要开启代码支持;
    * @param securityManager
    * @return
    */
   @Bean
   public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
       authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
       return authorizationAttributeSourceAdvisor;
   }
}


----这里需注意的是:URLPathMatchingFilter 并没有用@Bean管理起来,原因是Shiro的bug, 这个也是过滤器,ShiroFilterFactoryBean 也是过滤器,当他们都出现的时候,默认的什么anno,authc,logout过滤器就失效了。所以不能把他声明为@Bean。

------但是现在业务上URLPathMatchingFilter 里面又必须使用PermissionService类,我们可以借用SpringContextUtils 自定义的工具类,来获取PermissionService的实例。 

permissionService = SpringContextUtils.getContext().getBean(PermissionService.class);


-----具体的SpringContextUtils工具类

@Component
public class SpringContextUtils implements ApplicationContextAware{
private static ApplicationContext context;

   public static ApplicationContext getContext() {
return context;
   }

@Override
   public void setApplicationContext(ApplicationContext context) throws BeansException {
SpringContextUtils.context = context;
   }
}



③启动程序,查看效果:

----实现同样的效果,功能测试,正常实现。

 

 启动程序代码:





明天计划的事情:


分析复盘项目需求,

创建复盘项目数据库。

 



遇到的问题:




收获:

1.今天算是对spring boot进行了复习,在实现过程,对知识点又重新理解了一遍。






返回列表 返回列表
评论

    分享到