springboot 集成kerberos 用户认证 获取域账号

springboot 集成kerberos 用户认证 获取域账号

1. 只能在linux环境获取

MyWebSecurityConfiguration 需要改这个两行代码

java 复制代码
        ticketValidator.setServicePrincipal("设置名字一般是COM结尾");
        ticketValidator.setKeyTabLocation(new FileSystemResource("kerbtest05文件地址"));

2. DummyUserDetailsService.java

java 复制代码
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

public class DummyUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return new User(username, "notUsed", true, true, true, true,
                AuthorityUtils.createAuthorityList("ROLE_USER", "ROLE_ADMIN"));
    }
}

3. MyWebSecurityConfiguration

java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.FileSystemResource;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.kerberos.authentication.KerberosAuthenticationProvider;
import org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider;
import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosClient;
import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator;
import org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter;
import org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;

@Configuration
@EnableWebSecurity
@Order(Ordered.HIGHEST_PRECEDENCE)//可以加 可以不加看自己代码是否报错
public class MyWebSecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .exceptionHandling()
                .authenticationEntryPoint(spnegoEntryPoint())
                //.accessDeniedPage("/login")
                .and()
                .headers().frameOptions().sameOrigin()
                .and()
                .authorizeRequests()
                .antMatchers("/resources/**","/test2/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                //.loginPage("/login").permitAll()
                .and()
                .logout()
                .permitAll()
                .and()
                .addFilterBefore(spnegoAuthenticationProcessingFilter(), BasicAuthenticationFilter.class);
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(kerberosAuthenticationProvider())
            .authenticationProvider(kerberosServiceAuthenticationProvider());
    }

    @Bean
    public KerberosAuthenticationProvider kerberosAuthenticationProvider() {
        KerberosAuthenticationProvider provider = new KerberosAuthenticationProvider();
        SunJaasKerberosClient client = new SunJaasKerberosClient();
        client.setDebug(true);
        provider.setKerberosClient(client);
        provider.setUserDetailsService(dummyUserDetailsService());
        return provider;
    }

    @Bean
    public SpnegoEntryPoint spnegoEntryPoint() {
        return new SpnegoEntryPoint();
    }

    @Bean
    public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter() {
        SpnegoAuthenticationProcessingFilter filter = new SpnegoAuthenticationProcessingFilter();
        try {
            filter.setAuthenticationManager(authenticationManagerBean());
        } catch (Exception e) {
        }
        return filter;
    }

    @Bean
    public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() {
        KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider();
        provider.setTicketValidator(sunJaasKerberosTicketValidator());
        provider.setUserDetailsService(dummyUserDetailsService());
        return provider;
    }

    @Bean
    public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() {
        SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator();
        ticketValidator.setServicePrincipal("设置名字一般是COM结尾");
        ticketValidator.setKeyTabLocation(new FileSystemResource("kerbtest05文件地址"));
        ticketValidator.setDebug(true); //Turn off when it will works properly,
        return ticketValidator;
    }

    @Bean
    public DummyUserDetailsService dummyUserDetailsService() {
        return new DummyUserDetailsService();
    }

}

3.获取域账号 方法

java 复制代码
    public static String getCurrentUserId(HttpServletRequest req) {
        String userId = "";
        String sessionUserId = (String) req.getSession().getAttribute("userId");
        if (StringUtils.isNotEmpty(sessionUserId)) {
            userId = sessionUserId;
        } else {
            userId = req.getRemoteUser();
            if (userId != null && userId.indexOf("\\") > 0) {
                userId = userId.substring(userId.indexOf("\\") + 1).trim();
            } else if (userId != null && userId.indexOf("@") > 0) {
                userId = userId.substring(0, userId.indexOf("@")).trim();
            }
            req.getSession().setAttribute("userId", userId);
        }

        return userId;
    }

4. 将kerbtest05.keytab 打包到镜像中

相关推荐
zimoyin2 分钟前
浅浅了解下0拷贝技术
java·linux·开发语言
故事不长丨14 分钟前
Java List集合深度解析:从基础用法到实战技巧
java·链表·list·集合
程序员爱钓鱼18 分钟前
Node.js 编程实战:测试与调试 —— 调试技巧与性能分析
前端·后端·node.js
vyuvyucd21 分钟前
插件式开发:C++与C#实战指南
java·前端·数据库
开开心心就好25 分钟前
系统管理工具,多功能隐私清理文件粉碎工具
java·网络·windows·r语言·电脑·excel·symfony
小杨同学4929 分钟前
C 语言贪心算法实战:解决经典活动选择问题
后端
+VX:Fegn089530 分钟前
计算机毕业设计|基于springboot + vue物流配送中心信息化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·小程序·课程设计
随丶芯30 分钟前
IDEA安装leetcode-editor插件
java·开发语言
范什么特西36 分钟前
下载idea旧版本
java·ide·intellij-idea
计算机毕设指导642 分钟前
基于微信小程序的钓鱼论坛系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven