Spring 5 LDAP 身份验证和 JWT 令牌作为响应

2024-01-02

你好,我一直在尝试配置 spring,让它在用户/通行证通过 LDAP 服务器身份验证时返回 JWT 令牌;考虑下面的用例;

在上图中,我已将 WebSecurity 配置为使用 Bearer 检查/过滤请求。请参阅下面的代码

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationEntryPoint unauthorizedHandler;

    @Autowired
    JwtAuthorizationTokenFilter authenticationTokenFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Configure Web Security
        // Allow only /auth/
        // Disallow all others
        http
        .csrf().disable()
        .exceptionHandling().authenticationEntryPoint(unauthorizedHandler)
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .authorizeRequests()
        .antMatchers(HttpMethod.POST,
                     "/auth/**")
        .permitAll()
        .anyRequest().authenticated();      

        //Custom JWT 
        http.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

        // disable page caching
        http.headers().cacheControl();

    }
}

AuthCtrl.java

@RestController
@RequestMapping("auth")
public class AuthCtrl {

    private static final Logger logger = LoggerFactory.getLogger(AuthCtrl.class);

    @Autowired
    @Qualifier("authenticationManagerImpl")
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Autowired
    @Qualifier("userDetailsServiceImpl")
    private UserDetailsService userDetailsService;

    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) 
    public @ResponseBody String post(@RequestBody Map<String, String> credentials) {
        logger.info("POST: {} | {} ",credentials.get("username"), credentials.get("password"));
        String username = credentials.get("username");
        String password = credentials.get("password");

        Objects.requireNonNull(username);
        Objects.requireNonNull(password);

        try {
            authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
            // Reload password post-security so we can generate the token
            final UserDetails userDetails = userDetailsService.loadUserByUsername(username);
            final String token = jwtTokenUtil.generateToken(userDetails);
            return token;
        } catch (DisabledException e) {
            throw new AuthenticationException("User is disabled!", e);
        } catch (BadCredentialsException e) {
            throw new AuthenticationException("Bad credentials!", e);
        }
    }

    @ExceptionHandler({AuthenticationException.class})
    public ResponseEntity<String> handleAuthenticationException(AuthenticationException e) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(e.getMessage());
    }
}

以上配置基于youtube https://youtu.be/mD3vmgksvz8我看过的指南以及来自演示源的拉取git https://github.com/szerhusenBC/jwt-spring-security-demo。非常有帮助!,感谢业主。必须了解过滤器如何工作。

上述源已经可以过滤掉所有受保护的API,并在未授权时发送未授权的回复作为响应。我唯一允许匿名访问的 api 是身份验证 api/auth。它已经可以接收请求并通过网络过滤器。

但我不太清楚如何对 LDAP 服务器的上述请求进行身份验证并发送 JWT 令牌。在我读过的指南上,他们正在获取数据库上的用户信息。

我已经阅读了 WebConfiguration 中有关 LDAP 配置的一些文档,但无法将其与当前的过滤器关联起来。


请检查下面的链接,我使用 spring 4 创建了它。

配置您自己的 LDAP 服务器,而不是类路径上的 .ldif 文件。

https://github.com/merugu/springsecurity/tree/master/ldapauthenticationjwttoken https://github.com/merugu/springsecurity/tree/master/ldapauthenticationjwttoken

唯一的区别是对于 Spring 5 你应该使用 高级密码编码算法,如 Bcryptpasswordencoder。由于 LDAPpasswordEncoder 已被弃用。

快乐编码!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 5 LDAP 身份验证和 JWT 令牌作为响应 的相关文章

  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它

随机推荐

  • ES5 中的 Object.defineProperty?

    我看到关于 新 Object create 的帖子 它使枚举可配置 但是 它依赖于 Object defineProperty 方法 我找不到此方法的跨浏览器实现 我们是否还在为旧的 Object create 编写代码 我不能写在 IE6
  • 如何使用 C++ 对 Arduino 进行编程 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近我一直在摆弄我的 Arduino 我想知道是否有某种方法可以用 C 对 Arduino 进行编程 我一直在使用 C 对其进行编程加
  • ActiveCollab API 分页和速率限制

    我在以下位置找不到有关 API 分页或速率限制的信息 https developers activecollab com api documentation https developers activecollab com api doc
  • 如何在jquery mobile可折叠列表中添加多个图标

    我想在 jquery mobile 可折叠列表的加号图标附近添加另一个图标 但无法添加它 因为 jquery mobile 动态创建该图标 任何建议将不胜感激 这当然是一种 hack 但您可以等待页面初始化 然后找到列表视图小部件并将图标的
  • 使用 PowerShell 远程处理在活动用户会话中启动程序

    是否可以检测到特定用户在计算机上有一个打开的会话 并在该会话中打开一个进程 以便用户可以使用 PowerShell 远程处理与应用程序进行交互 我将如何检测哪些用户在计算机上打开了会话以及他们的状态 活动 空闲 断开连接等 我如何在其中一个
  • 如何在 Python 中将一维数组打印为网格?

    我有一个包含 200 个项目的数组 grid 0 0 0 0 0 0 0 0 0 0 0 0 0 0 and so on 我怎样才能像这样将它打印为二维数组 实际上每 10 个字符就分割一次 0 0 0 0 0 0 0 0 0 0 0 0
  • 如何防止 ReSharper 在添加 using 指令时缩短命名空间?

    当我使用 ReSharper 添加 using 指令 使用 Alt Enter 时 它会删除命名空间的 不必要 部分 我更喜欢使用完整的命名空间 这也是 Visual Studio 的行为 Example namespace MyCompa
  • CF8 和 AES 解密 MySQL AES:编码不同

    这已经成为一种练习 告诉我我做错了什么 而不是关键任务 但我仍然想看看我犯了什么 可能很简单 的错误 我正在使用 mysql 5 1 x AES ENCRYPT 来加密字符串 我正在使用 CF 的generateSecretKey AES
  • 如何提供要在 Google-Now-On-Tap 上显示的内容?

    背景 我正在开发一个可以回答某些查询 电话号码查询 也许还有其他查询 的应用程序 谷歌在 Android 6 上引入了一项新功能 称为 Google Now On Tap 又名 Assist API 它允许用户查询屏幕上显示的内容 通过长按
  • C# 中有“upto”方法吗?

    下面是一段打印 0 到 9 数字平方的代码 for int i 0 i lt 10 i Console WriteLine i i 通过 a 做从 0 到 N by 1 的事情for循环是一个非常常见的习惯用法 这是一个UpTo表达这一点的
  • 如何在不实际索引数组的情况下获取已知形状数组的索引元素数量?

    我有一个索引IDX 可以是索引列表 布尔掩码 切片元组等 索引一些已知形状的抽象 numpy 数组shape 可能很大 我知道我可以创建一个虚拟数组 对其进行索引并计算元素数 A np zeros shape print A IDX siz
  • 使用两个版本的 Python 安装 IPython (Windows)

    是否可以有IPython 0 12 安装在same系统有两个不同版本的 Python v 2 7 和 3 2 目前 我的系统上运行着两个版本的 Python 我使用两台机器 一台带有Windows 7 64 位 另一个XP SP2 32 位
  • Xml Linq,删除 XElement C# 中的重复节点

    我使用 Xml Linq 来管理 xml 配置文件 我有 XElement Company CalidadCodigo ParserSQL Reglas 我需要删除 XElement 中的重复值 节点 Add Key Value 其中值重复
  • Groovy:“def x = 0”中“def”的用途是什么?

    在下面的代码中 摘自Groovy 语义手册页 http groovy lang org semantics html while loop 为什么要在赋值前加上关键字def def x 0 def y 5 while y gt 0 prin
  • 一条消息可以有多个发件人吗?

    当我想检查谁使用 JavaMail 向我发送了特定电子邮件时 我可以用 Message getFrom 它返回一个 Message 在什么情况下 一条复活的消息可以有多个来自它的身份 关于API https javamail java ne
  • 如何在 vue nuxt ts 中对特定 div 使用滚动事件监听器

    我知道 nuxt js 很有可能做到这一点 但是我们如何使用 nuxt 和丑陋的 ts 来做到这一点呢 如果有人能够做到这一点 请将此代码转换为 script lang ts 的条款 对于 nuxt 来说 在监听特定 div 附加示例的滚动
  • MySQL InnoDB 因等待表级锁而挂起

    我有一个大型生产网络应用程序 Glassfish 3 1 MySQL 5 5 所有表都是InnoDB 每隔几天应用程序就会完全挂起 SHOW FULL PROCESSLIST显示不同表上的许多简单插入或更新查询 但都有状态 等待表级锁 例子
  • 从 JSP 列表填充 JavaScript 数组

    好吧 也许有人可以帮助我解决我正在尝试解决的问题 本质上 我有一个 JSP 页面 它获取 Country 对象的列表 来自 Spring Portlet SimpleFormController 的方法 referenceData 不完全相
  • Spark 中的任务是什么? Spark Worker如何执行jar文件?

    阅读了一些文档后http spark apache org docs 0 8 0 cluster overview html http spark apache org docs 0 8 0 cluster overview html 我有
  • Spring 5 LDAP 身份验证和 JWT 令牌作为响应

    你好 我一直在尝试配置 spring 让它在用户 通行证通过 LDAP 服务器身份验证时返回 JWT 令牌 考虑下面的用例 在上图中 我已将 WebSecurity 配置为使用 Bearer 检查 过滤请求 请参阅下面的代码 WebSecu