我已经对此做了很多研究,有很多例子,但是我被这些选择弄得不知所措,但是我已经把一些代码放在一起做我想做的事情。
我有一个Apache负载均衡器,它将我重定向到我们OpenAM 10的登录页面。当我去https://portal.mydomain.com/myapp我被重定向到:https://sso.mydomain.net:9443/sso/UI/Login?module=AGMAuth
这是我的登录页面,要求我输入用户名和密码,然后我得到一个类似于(AQIC5wM2LY4Sfcyl9raxhA-xBE14_4QBbkjXi-rFn43PMpc.AAJTSQACMDE)的令牌变成饼干。从前端,我可以从cookie中获取令牌,我可以将它添加到后端的每个调用的请求头中,这是一个SpringMVC RESTful后端。
仅供参考,我知道如何调用OpenAM RESTful api,传递令牌并获取用户名和其他一些信息。角色不保留在OpenAM中。如果在我的RESTful Web服务的后端,我用令牌调用OpenAM...如果我没有得到任何数据,那么我想回到我的自定义身份验证登录页面:https://sso.mydomain.net:9443/sso/UI/Login?module=AGMAuth
这是我的一个安全URL的控制器:
@RequestMapping(value = "/trialId/{trialId}", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody TrialEntity getTrialById(@PathVariable("trialId") long trialId)
{
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
System.out.println("TrialController: getTrialById: principal");
UserAccountEntity user = null;
if (principal instanceof UserAccountEntity)
{
user = ((UserAccountEntity) principal);
}
TrialEntity trialEntity = service.getById(trialId);
System.out.println("TrialController: retrieveTrial: trialEntity=" + trialEntity);
return trialEntity;
}
我是否需要让每个安全URL都尝试获取主体?
现在这是我的Spring安全。XML安全文件。这可能不正确,但这是我开始的地方:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/html" target="_blank">beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.0.xsd">
<http realm="Protected API"
use-expressions="true"
create-session="stateless"
entry-point-ref="unauthorizedEntryPoint"
authentication-manager-ref="restAuthenticationManager">
<custom-filter ref="authenticationTokenProcessingFilter" position="FORM_LOGIN_FILTER" />
<intercept-url pattern="/corelabs" access="permitAll" />
<intercept-url pattern="/sponsors" access="permitAll" />
<intercept-url pattern="/trials/trialId/**" access="hasRole('trialAdmin')" />
<intercept-url pattern="/subjects" access="hasRole('siteSender') and hasRole('trialManager')" />
</http>
<authentication-manager>
<authentication-provider ref="customAuthenticationProvider"/>
</authentication-manager>
<beans:bean id="customUserDetailsService" class="com.agmednet.server.security.CustomUserDetailsService" />
</beans:beans>
现在,在后端有一些安全代码。这是返回数据库以根据用户名获取用户详细信息的代码,我还可以加载此用户的角色。我从SpringSecurity4的一个例子中得到了这个。
@Service("customUserDetailsService")
@Transactional
public class CustomUserDetailsService implements UserDetailsService
{
private static final Log logger = LogFactory.getLog(CustomUserDetailsService.class);
@Autowired
private UserAccountDao userAccountDao;
@Transactional(readOnly = true)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
System.out.println("CustomUserDetailsService: username : " + username);
UserAccountEntity userAccountEntity = userAccountDao.getByUsername(username);
System.out.println("CustomUserDetailsService: userAccountEntity : " + userAccountEntity);
if (userAccountEntity == null)
{
System.out.println("CustomUserDetailsService: userAccountEntity not found");
throw new UsernameNotFoundException("Username not found");
}
System.out.println("CustomUserDetailsService: START: springframework.user");
// this "User" object is: org.springframework.security.core.userdetails.User
User user = new User(userAccountEntity.getUsername(), userAccountEntity.getPassword(), true, true, true, true,
getGrantedAuthorities(userAccountEntity));
System.out.println("CustomUserDetailsService: FINISH: springframework.user = " + user);
return user;
}
private List<GrantedAuthority> getGrantedAuthorities(UserAccountEntity userAccountEntity)
{
System.out.println("getGrantedAuthorities: START");
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (UserRoleEntity userRoleEntity : userAccountEntity.getUserRoleList())
{
System.out.println("getGrantedAuthorities: UserRoleEntity : " + userRoleEntity);
authorities.add(new SimpleGrantedAuthority("ROLE_" + userRoleEntity.getUserRoleName()));
}
System.out.print("authorities :" + authorities);
return authorities;
}
}
这是另一段安全代码,我不确定这是否适用于我。因为在本例中,我实际上是在研究预认证策略,我不确定它们中是否有任何一种真的适用于本例。我还看到我可以实现RequestHeaderFilter,但我也不确定这是否适合。
public class CustomAuthenticationProvider implements AuthenticationProvider
{
@Autowired
private CustomUserDetailsService userService;
public Authentication authenticate(Authentication authentication) throws AuthenticationException
{
String username = authentication.getName();
String password = (String) authentication.getCredentials();
UserDetails user = userService.loadUserByUsername(username);
if (user == null || !user.getUsername().equalsIgnoreCase(username))
{
throw new BadCredentialsException("Username not found.");
}
if (!password.equals(user.getPassword()))
{
throw new BadCredentialsException("Wrong password.");
}
Collection<? extends GrantedAuthority> authorities = user.getAuthorities();
return new UsernamePasswordAuthenticationToken(user, password, authorities);
}
public boolean supports(Class<?> arg0)
{
return true;
}
}
因此,我引入了一些代码,并试图根据其他人的工作解决方案的许多细微变化来理解这一切是如何工作的。同样,我有一个来自第三方API的令牌,它放在一个cookie中。所以,我在看“记住我”的场景,这对我来说绝对有意义。。。除了当令牌无效、过期或不存在时,我会被重新定向到该第三方登录页面。我想我看到了一个自定义登录表单的示例,该表单提供了一个URL,因此如果身份验证无效(令牌不存在或无效),那么我们就没有授权,并发送回该自定义登录URL,该URL对我有效。
基于我已经添加的内容,我应该能够在将令牌传递给OpenAM后从令牌中获得用户名...但是我需要某种请求头过滤器来首先获得它吗...然后使用该用户名加载用户详细信息和角色,并把它放在安全上下文中?
我只是这个Spring安全管道的一个闲人,所以任何关于这个特殊设置的帮助都会非常有帮助。顺便说一句,我不介意使用XML进行Spring Security配置。如果我需要添加我的网站。xml文件,我也可以这样做,但请假定我确实设置了我的web。正确使用xml。谢谢
更新:我有一个单元测试,看起来像:
@Test
public void testMockGetById() throws Exception
{
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get(BASE_URL + "/trialId/149");
this.mockMvc.perform(requestBuilder).andDo(print()).andExpect(status().isOk());
}
基于下面建议的SiteMinder示例。我现在正在寻找一个名为“openam_token”而不是“SM_USER”的请求头,我已经在没有token的情况下测试了这个请求头,我得到了500个错误,即没有token。
所以,现在我需要修改我的单元测试,以便在请求头中添加令牌。此令牌将返回有权访问此URL的正确用户。第二个测试是拥有来自不同用户的令牌,该用户无权访问此URL。如果我的测试条件有效,我会认为这是一场胜利。
Siteminder身份验证的工作方式类似于在负载平衡器(Apache)上设置请求头。我建议大家看看siteminder是如何使用Spring Security设置的。请看这里的这个和spring文档。
不要认为您需要CustomAuthenticationProvider
,因为身份验证是在请求到达rest API之前处理的。
我有一个LaravelAPI(实际上是LumenAPI)服务于VueJS前端。Vue应用程序允许用户登录到谷歌。然后将Google令牌发送回Lumen API,后者使用Google验证令牌,然后验证电子邮件地址是否为有效用户。然后它生成一个令牌,与用户一起存储在数据库中,并返回用户对象。 我没有使用Passport或jwt auth之类的东西。那么现在,我如何使用默认的Auth中间件来验证(现在已
null
我刚刚开始在.NET中开发我的第一个REST API。由于它将是无状态的,我将使用令牌进行身份验证: 基本思想(System.Security.Cryptography): null 检查凭据是否有效(用户名,将哈希密码与db值进行比较) 如果为真,则加密数据对象 对生成的令牌使用HMAC,并将其存储到数据库 将令牌(不带HMAC)返回给用户(cookie/字符串) 对需要身份验证的方法的请求:
我有一个REST Jersey web服务。 php中基于令牌的身份验证 它在答复中提到; “然后它发送此令牌和请求的某些特征的哈希来验证请求,例如sha1(令牌+时间戳+请求URL+请求正文)。您的服务器可以对此进行验证,而客户端不必在每个请求上以纯文本发送令牌。” 另一个问题是,一旦服务器接收到这个令牌的哈希值(包括时间戳和用户ID等),服务器如何在没有存储令牌的查找表或数据库的情况下从这个令
我正在尝试在Dropwizard web应用程序中实现OAuth2身份验证。我已经创建了所需的<code>验证器 我所需的行为是,在我的客户端通过在我的登录页面上提供他/她的凭据登录后,我想将客户端重定向到我使用Dropwizard Views创建的问候语页面,并且路径为“/me”,如下所示: 我的问候资源如下所示: 目前,我得到一个“访问此资源需要凭据。”登录后的响应。在阅读了一些关于令牌认证的
在传统的基于cookie/JSESSION的身份验证的同时,是否可以使用基于令牌的(无状态)身份验证? 应用程序已经有一个现有的Spring MVC+Thymeleaf实现,用作管理/超级用户门户。当你登录时,你会得到一个JessionID。我们需要使用Jersey(JAX-RS)创建一个RESTful API以供客户端使用。要求是无状态的。本质上,我们仍然需要Spring MVC+Thymele