• 技术文章 >Java >java教程

    详解spring boot配置单点登录的案例分享

    黄舟黄舟2017-03-24 10:36:16原创1774
    本篇文章主要介绍了详解spring boot配置单点登录,常用的安全框架有spring security和apache shiro。shiro的配置和使用相对简单,本文使用shrio对接CAS服务。

    概述

    企业内部一般都有一套单点登录系统(常用的实现有apereo cas),所有的内部系统的登录认证都对接它。本文介绍spring boot的程序如何对接CAS服务。

    常用的安全框架有spring security和apache shiro。shiro的配置和使用相对简单,本文使用shrio对接CAS服务。

    配置

    新增依赖

    pom.xml新增:

    <properties>
      <shiro.version>1.2.4</shiro.version>
     </properties>
    <dependencies>
    <!--Apache Shiro -->
      <dependency>
       <groupId>org.apache.shiro</groupId>
       <artifactId>shiro-spring</artifactId>
       <version>${shiro.version}</version>
      </dependency>
      <dependency>
       <groupId>org.apache.shiro</groupId>
       <artifactId>shiro-ehcache</artifactId>
       <version>${shiro.version}</version>
      </dependency>
      <dependency>
       <groupId>org.apache.shiro</groupId>
       <artifactId>shiro-cas</artifactId>
       <version>${shiro.version}</version>
      </dependency>
    </dependencies>

    spring boot配置

    application.properties

    shiro.cas=https://cas.xxx.com # 这是CAS服务的地址
    shiro.server=http://127.0.0.1:8080 # 自己应用的地址,测试使用127即可

    应用配置

    初始化shiro bean,将文件放到任意子包下即可,比如xxx.config,spring boot会自动扫描加载

    @Configuration
    public class ShiroCasConfiguration {
     private static final String casFilterUrlPattern = "/shiro-cas";
    
     @Bean
     public FilterRegistrationBean filterRegistrationBean() {
      FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
      filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
      filterRegistration.addInitParameter("targetFilterLifecycle", "true");
      filterRegistration.setEnabled(true);
      filterRegistration.addUrlPatterns("/*");
      return filterRegistration;
     }
    
     @Bean(name = "lifecycleBeanPostProcessor")
     public LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
      return new LifecycleBeanPostProcessor();
     }
    
     @Bean(name = "securityManager")
     public DefaultWebSecurityManager getDefaultWebSecurityManager(@Value("${shiro.cas}") String casServerUrlPrefix,
                     @Value("${shiro.server}") String shiroServerUrlPrefix) {
      DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
      CasRealm casRealm = new CasRealm();
      casRealm.setDefaultRoles("ROLE_USER");
      casRealm.setCasServerUrlPrefix(casServerUrlPrefix);
      casRealm.setCasService(shiroServerUrlPrefix + casFilterUrlPattern);
      securityManager.setRealm(casRealm);
      securityManager.setCacheManager(new MemoryConstrainedCacheManager());
      securityManager.setSubjectFactory(new CasSubjectFactory());
      return securityManager;
     }
    
     private void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean) {
      Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    
      filterChainDefinitionMap.put(casFilterUrlPattern, "casFilter");
      filterChainDefinitionMap.put("/login", "anon");
      filterChainDefinitionMap.put("/bower_components/**", "anon");//可以将不需要拦截的静态文件目录加进去
      filterChainDefinitionMap.put("/logout","logout");
      filterChainDefinitionMap.put("/**", "authc");
      shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
     }
    
     /**
      * CAS Filter
      */
     @Bean(name = "casFilter")
     public CasFilter getCasFilter(@Value("${shiro.cas}") String casServerUrlPrefix,
             @Value("${shiro.server}") String shiroServerUrlPrefix) {
      CasFilter casFilter = new CasFilter();
      casFilter.setName("casFilter");
      casFilter.setEnabled(true);
      String loginUrl = casServerUrlPrefix + "/login?service=" + shiroServerUrlPrefix + casFilterUrlPattern;
      casFilter.setFailureUrl(loginUrl);
      return casFilter;
     }
    
     @Bean(name = "shiroFilter")
     public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager,
                   CasFilter casFilter,
                   @Value("${shiro.cas}") String casServerUrlPrefix,
                   @Value("${shiro.server}") String shiroServerUrlPrefix) {
      ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
      shiroFilterFactoryBean.setSecurityManager(securityManager);
      String loginUrl = casServerUrlPrefix + "/login?service=" + shiroServerUrlPrefix + casFilterUrlPattern;
      shiroFilterFactoryBean.setLoginUrl(loginUrl);
      shiroFilterFactoryBean.setSuccessUrl("/");
      Map<String, Filter> filters = new HashMap<>();
      filters.put("casFilter", casFilter);
      LogoutFilter logoutFilter = new LogoutFilter();
      logoutFilter.setRedirectUrl(casServerUrlPrefix + "/logout?service=" + shiroServerUrlPrefix);
      filters.put("logout",logoutFilter);
      shiroFilterFactoryBean.setFilters(filters);
    
      loadShiroFilterChain(shiroFilterFactoryBean);
      return shiroFilterFactoryBean;
     }
    }

    程序中获取登录的用户名

    上述配置完成后,就可以找程序中获取登录用户的名字了

    public String getUsername() {
      Subject subject = SecurityUtils.getSubject();
      if (subject == null || subject.getPrincipals() == null) {
       return DEFAULTUSER;
      }
      return (String) subject.getPrincipals().getPrimaryPrincipal();
     }

    总结

    shiro使用还是比较简单的,使用的时候只需要修改application.properties即可

    以上就是详解spring boot配置单点登录的案例分享的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    上一篇:详解MyBatis关于二级缓存问题的代码实例 下一篇:java中Set与Map排序输出到Writer的示例代码分享
    大前端线上培训班

    相关文章推荐

    • 理解java8中java.util.function.*pojo反射新方法(附代码)• 浅析安卓app和微信授权登录及分享完整对接(代码分享)• 一招教你使用java快速创建Map(代码分享)• 教你一招搞定时序数据库在Spring Boot中的使用• 一文讲解Java中初始化List集合的8种方式(附代码)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网