UserDetails类中loaduserByUsername中获取不到用户名

本文讲述了在使用SpringSecurity时,关于UserDetails类loadUserByUsername方法与数据库映射的username字段名称不一致导致的问题,以及解决过程,包括数据库结构调整和接口参数变更。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Spring Security框架中的UserDetails类方法要注意的事项

最近在新项目中使用了SpringSecurity中的UserDetails类中loaduserbyUsername方法,在数据库和对应的映射文件中username字段使用的account代替,json中的登录接口账号也是

{
"account":xxx,
"password":xxx
}

的方式,后来发现在验证token的时候,获取不到username,
原来loadUserByUsername方法调用后,获取到的用户信息对象,想要获取username,必须把account改为username,才可以调用UserDetails类中的getUsername方法返回用户信息,因为该方法只会找到获取对象中的key为username的value,而使用其他名作为key是找不到username的,所以会返回null,使得token获取对象账号失败。
再改回数据库表头字段为username和resourses目录下mapper.XML获取的用户名把account改为username,pojo层和service层对应的account都改为username后,还得把前端传的登录接口进行相应的更改:

{
"username":xxx,
"password":xxx
}

最后重启服务尝试:
在这里插入图片描述

成功!!!

在 Spring Security 中,`Authentication` 对象是用来表示用户已经通过身份验证的信息。如果你想在认证中包含 IP 地址,虽然这不是标准做法,但是你可以通过自定义实现来做到这一点。这里是一个简单的例子: 首先,创建一个自定义的 `UserDetails` 接口或者实现 `AbstractUserDetails` 并添加一个新的属性来保存 IP 地址: ```java public class CustomUserDetails extends AbstractUserDetails { private String username; private String ipAddress; // getters and setters } ``` 然后,在你的认证处理器(如 `UserServiceAuthenticationProvider` 或者 `UsernamePasswordAuthenticationFilter` 的实现)里,你可以这样做: ```java @Override protected UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { CustomUserDetails userDetails = ...; // 这里应该是从数据库或者其他数据源获取用户的详细信息,包括 IP 地址 userDetails.setIpAddress("your_ip_address"); return userDetails; } ``` 最后,确保你在构建 `Authentication` 对象时包含了这个自定义信息: ```java Authentication authentication = new UsernamePasswordAuthenticationToken( userDetails, userDetails.getPassword(), // 用户密码 userDetails.getAuthorities() ); // 添加 IP 地址作为额外的属性,这通常是安全考虑,因为不应该直接放入 Authentication 对象 Map<String, Object> details = new HashMap<>(); details.put("ipAddress", userDetails.getIpAddress()); authentication.setDetails(details); ``` 注意,这样的设计并不是最佳实践,因为 `Authentication` 对象通常只包含用户名、密码等核心信息,而 IP 地址可以被视为敏感数据,不应随意存储。但在某些特定场景下,比如审计日志或安全策略中可能需要这样做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值