/**
*
*/
package com.thinkbiganalytics.test.security;
/*-
* #%L
* kylo-commons-test
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.List;
import org.springframework.core.annotation.AliasFor;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.authentication.jaas.JaasGrantedAuthority;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.security.test.context.support.WithSecurityContext;
import org.springframework.security.test.context.support.WithSecurityContextFactory;
import org.springframework.util.StringUtils;
import com.thinkbiganalytics.security.GroupPrincipal;
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@WithSecurityContext(factory = WithMockJaasUser.JaasSecurityContextFactory.class)
@WithMockUser
public @interface WithMockJaasUser {
@AliasFor(annotation = WithMockUser.class, attribute="value")
String value() default "user";
@AliasFor(annotation = WithMockUser.class, attribute="username")
String username() default "";
@AliasFor(annotation = WithMockUser.class, attribute="password")
String password() default "password";
@AliasFor(annotation = WithMockUser.class, attribute="authorities")
String[] authorities() default {};
@AliasFor(annotation = WithSecurityContext.class, attribute="factory")
Class<? extends WithSecurityContextFactory<? extends Annotation>> factory() default WithMockJaasUser.JaasSecurityContextFactory.class;
public static class JaasSecurityContextFactory implements WithSecurityContextFactory<WithMockJaasUser> {
/* (non-Javadoc)
* @see org.springframework.security.test.context.support.WithSecurityContextFactory#createSecurityContext(java.lang.annotation.Annotation)
*/
@Override
public SecurityContext createSecurityContext(WithMockJaasUser withUser) {
String username = StringUtils.hasLength(withUser.username()) ? withUser.username() : withUser.value();
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
for (String authority : withUser.authorities()) {
grantedAuthorities.add(new JaasGrantedAuthority(authority, new GroupPrincipal(authority)));
}
User principal = new User(username, withUser.password(), true, true, true, true, grantedAuthorities);
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, principal.getPassword(), principal.getAuthorities());
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authentication);
return context;
}
}
}