我的要求是:
在我的应用程序中,当用户通过登录屏幕(而不是使用Spring Security)登录时,身份验证第一次由定制的第三方API执行。现在,我们几乎没有使用rest服务调用的增强功能。根据要求,在从应用程序发出任何rest调用之前,我们需要根据数据库重新验证用户。由于用户在使用登录屏幕登录时已经进行了验证,并且请求中提供了这些详细信息,因此我计划使用spring security对用户进行重新身份验证(预身份验证场景)。我们没有为应用程序中的用户定义任何角色。所以不用担心角色。我已经阅读了参考手册,但我没有得到更多关于如何进一步操作的信息。我理解的一件事是,在用户通过定制的第三方API进行身份验证后,我们需要以某种方式告诉spring上下文。就连我也在谷歌上搜索了一下,但找不到一个符合我要求的好例子。如果有人能指导我如何从一个例子开始,那就太好了。
我只需要告诉spring上下文“嘿..!这个用户已经过身份验证,这样他就可以在用户的凭据通过定制的第三方API验证后调用rest服务了。”。
我不应该改变现有的初始身份验证过程。我应该只使用经过身份验证的用户信息,并进一步使用Spring Security性来重新验证用户。
我的问题与spring参考手册中提到的问题类似http://docs.spring.io/spring-security/site/docs/3.0.x/reference/preauth.html
请不要用单行回答(除非有正确的外部链接)。如果你能给我看一个例子或伪代码,那就太好了。
提前感谢。
对于第一次身份验证,我希望您可以使用一些输入值(如用户名/密码)调用第三方API,并返回true/false。如果是这样,您可以编写自己的AuthenticationProvider,如下所示。并调用第三方身份验证,如下所示。Spring security framework将自动设置SecurityContextHolder。getContext()。setAuthenticated(真或假);照着你不需要设置这个。
public class MyAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String user = (String) authentication.getPrincipal();
String password = (String) authentication.getCredentials();
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("ROLE_ONE"));
authorities.add(new SimpleGrantedAuthority("ROLE_TWO"));
UsernamePasswordAuthenticationToken authenticationToken = null;
if (<your 3rd party authentication result == true>)) {
authenticationToken = new UsernamePasswordAuthenticationToken(user, password, authorities);
} else {
throw new BadCredentialsException("Invalid credentials supplied. Please try again.");
}
return authenticationToken;
}
@Override
public boolean supports(Class<?> authentication) {
boolean supports = authentication.isAssignableFrom(UsernamePasswordAuthenticationToken.class);
return supports;
}
}
在进行进一步的REST API调用之前,您可以在其Spring控制器中检查用户是否有效,是否使用代码SecurityContextHolder.getContext()。
您还可以通过下面的代码获得许多其他用户信息。
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
System.out.println("getAuthorities : " + authentication.getAuthorities());
System.out.println("getName : " + authentication.getName());
System.out.println("getCredentials : " + authentication.getCredentials());
System.out.println("getDetails : " + authentication.getDetails());
System.out.println("getPrincipal : " + authentication.getPrincipal());
if (authentication.getPrincipal() instanceof User) {
User user = (User) authentication.getPrincipal();
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getAuthorities());
}
你试过这个吗?
SecurityContextHolder.getContext()。
http://docs.spring.io/autorepo/docs/spring-security/3.0.x/apidocs/org/springframework/security/core/Authentication.html
我建议建立一个从Spring Security到第三方登录页面的“桥梁”。如果你和Spring一起工作,我认为这是最好的工作方式。
也就是说,你有一个登录处理程序,它将用户重定向到第三方登录页面。登录后,用户将被重定向回网络应用。
这就是你的意思吗?听起来好吗?这有意义吗?
如果是这样,您可以使用我的文章获得一些帮助:
<security:http entry-point-ref="legacyEntryPoint">
一般来说,这意味着每当相关的http调用试图访问你的应用程序时,这就是处理请求的入口点。在您的例子中,legacyEntryPoint是您将实现的一个类,它将检查用户是否经过身份验证;如果没有,它会将用户重定向到第三方登录系统,否则它会使用已知的“令牌”来使用你的应用程序。
希望有帮助!
我想写一个应用程序,允许与数据交互的两种RESTful形式;常规REST CRUDendpoint和Web-UI。 过去,我在JS中实现了UI的大部分功能,这将调用常规的RESTendpoint。这很好,但对于这个应用程序,我想使用Qute来执行生成页面内容的大部分基本功能。但是,为了正确地管理endpoint并确保正确的RBAC控制,我需要通过cookie而不是普通的头来访问JWT。这似乎是可能
我的问题是:为了实现授权,是否有一种简单的方法来更改Olingo JPA处理器以在默认情况下连接表和过滤实体?这将需要我能够传入帐户过滤,也限制所有的结果。 我也尝试过这里描述的预处理和后处理。但是,过滤需要在查询中进行,而不是在返回结果之后,因为JPA查询将返回太多的结果,并且转换数千个对象的时间长且成本高。 到目前为止,我已经实现了一个CustomoDataJPaprocessor。但是,现在
Serenity 使用一些抽象(abstractions)来与你的应用程序自身的用户身份验证和授权机制一起工作。 Serenity.Abstractions.IAuthenticationService Serenity.Abstractions.IAuthorizationService Serenity.Abstractions.IPermissionService Serenity.Abst
请求地址 https://api.es.xiaojukeji.com/river/Auth/authorize 返回数据格式 JSON 请求方式 POST 是否需要登录 否 访问授权限制 调用方访问授权后,将返回的授权信息缓存半小时(缓存过期或调用服务时返回401=>access_token不合法或已过期,再重新申请授权),不要每次调用接口都申请一次授权。 请求参数 名称 类型 必选 描述 cli
说明 调用方访问授权后,将返回的授权信息缓存半小时(缓存过期或调用服务时返回401=>access_token不合法或已过期,再重新申请授权),不要每次调用接口都申请一次授权。 地址URL /v1/Auth/authorize 支持格式 Json或普通form HTTP请求方式 POST 是否需要登录 否 请求参数 名称 类型 必选 描述 client_id string yes 申请应用时分配的
我正在尝试使用外部服务在Spring设置预身份验证安全性。登录入口点重定向到一个外部页面,该页面在成功登录后会将身份验证信息放入 Cookie 中。之后,外部应用程序重定向回我的应用程序,并且我的 被正确调用,并且我能够返回一个主体值,然后我希望将其传递给我的用户详细信息服务,在那里我可以创建正确的用户对象,但它最终会在此之前抛出错误。这是代码 这就是我犯的错误 任何帮助都将不胜感激