我以为我的授权实现已经完成,但是当试图检索用户详细信息对象时,我得到的只是用户名。
我正在使用oauth,并提供以下详细信息。
配置AuthenticationManager:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
完成后,我可以调试到我的userDetailsService:
@Service
public class UserServiceImpl implements UserService, UserDetailsService {
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
MyUser persistedUser = userRepository.findByEmail(email);
if (persistedUser == null) {
throw new UsernameNotFoundException(String.format("The email %s doesn't exist", email));
}
List<GrantedAuthority> authorities = new ArrayList<>();
MyUser inMemoryUser = new MyUser(persistedUser.getEmail(), null, persistedUser.getEnabled(), false,
false, false, authorities);
return inMemoryUser;
}
}
这完成得很好,我的客户端得到了JWT。但是我在调试以后的控制器方法时发现了以下问题。
@GetMapping
public @ResponseBody Iterable<Curriculum> getMyCurriculums(@AuthenticationPrincipal MyUser injectedUser) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
MyUser principle = (MyUser) auth.getPrincipal();
return curriculumService.findByUser(principle);
}
在本例中,injectedUser=null,auth是一个OAuth2Authentication,principle是一个字符串——用户名。应该是我的用户
您应该将Spring Security配置为将jwt令牌解码为MyUser
对象。
首先定义一个自定义的OAuth2Authentication
来封装MyUser
。
public class OAuth2AuthenticationUser extends OAuth2Authentication {
private MyUser myUser;
public OAuth2AuthenticationUser(OAuth2Request storedRequest, Authentication userAuthentication) {
super(storedRequest, userAuthentication);
}
public MyUser getMyUser() {
return myUser;
}
public void setMyUser(MyUser) {
this.myUser= myUser;
}
}
然后在安全配置类中,按如下方式配置jwt令牌解码:
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("SIGNING_KEY");
converter.setAccessTokenConverter(getAuthenticationAccessTokenConverter());
return converter;
}
private DefaultAccessTokenConverter getAuthenticationAccessTokenConverter() {
return new DefaultAccessTokenConverter() {
@Override
public OAuth2Authentication extractAuthentication(Map<String, ?> map) {
OAuth2Authentication authentication = (OAuth2Authentication) super.extractAuthentication(map);
OAuth2AuthenticationUser authenticationUser =
new OAuth2AuthenticationUser(authentication.getOAuth2Request(), authentication.getUserAuthentication());
MyUser myUser = new MyUser();
// Example properties
myUser.setId(map.get("id") != null ? Long.valueOf(map.get("id").toString()) : null);
myUser.setUsername(map.get("user_name") != null ? map.get("user_name").toString() : null);
myUser.setFullName(map.get("fullName") != null ? map.get("fullName").toString() : null);
myUser.setCustomerId(map.get("customerId") != null ? Long.valueOf(map.get("customerId").toString()) : null);
myUser.setCustomerName(map.get("customerName") != null ? map.get("customerName").toString() : null);
// More other properties
authenticationUser.setMyUser(myUser);
return authenticationUser;
}
};
}
然后您可以从Spring Security上下文访问MyUser
对象,如下所示:
private static MyUser getMyUser() {
OAuth2AuthenticationUser authentication = (OAuth2AuthenticationUser) SecurityContextHolder.getContext().getAuthentication();
return (authentication != null && authentication.getMyUser() != null ? authentication.getMyUser() : new MyUser());
}
这非常适合无状态环境,因为用户详细信息的数据库访问被最小化,您只需要jwt令牌。
根据这个问题,这是登录失败的结果。AuthenticationToken(在本例中是UsernamePasswordAuthenticationToken)被AuthenticationManager拒绝。我不知道它为什么要做这样的事。默认UserDetails对象的身份验证似乎工作得很好。有人能帮我解决这个问题吗? 关于已实现类的一些细节(如上所述)。由于原因,这里遗漏了一些代码。 Custom
问题内容: 我用如下猫鼬定义了一个模型: 然后创建了一个用户,可以通过mongo控制台完美地找到它,如下所示: 但是,当我尝试通过带有mongoose的node.js访问此对象时,要检索的对象不是此类文档,而是包装器: 这段代码… 从console.dir(doc)产生此输出… 因此,密码将不匹配,因为doc.password未定义。 为什么会这样呢? 问题答案: 这正是包裹猫鼬对象的猫鼬的目的。
如何在volley中发出JSON请求,我需要在正文中发送一个验证头和JSON对象,并且我只希望得到一个状态代码200的答案 我尝试了使用string或JSON object,object的不同类型的响应侦听器,但总是出现错误:android volley org.JSON.JSONException:在字符0的输入结束 或者volley中是否有其他类型的请求支持json对象和主体中的验证头,并且响
我正在为我的单选按钮使用ItemListener。我看到了很多ItemListener函数,但我的似乎工作方式不同。 它返回的值是“javax.swing.JRadioButton[User,445453,49x18,alignmentX=0.0,alignmentY=0.5,border=javax.swing.plaf.synth”。SynthBorder@1f2f60d,flags=288,
问题内容: 我正在尝试使用我的Facebook帐户登录到我的网站,但是Facebook仅给出名称和ID,不足以登录用户。在我获得完整的信息之前,例如名字,姓氏,电子邮件等。 现在由facebook提供的数据: 我正在使用Oauth v2.0通过Facebook将用户登录到我的网站。 问题答案: 看起来您正在使用Graph API的v2.4。看到 https://developers.faceboo
问题内容: 我有以下简单的看法。为什么会导致此错误? 问题答案: 因为视图必须 返回 ,而不仅仅是调用它。将最后一行更改为