Skip to content

Commit

Permalink
Merge branch 'release/0.5.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
foo4u committed Dec 14, 2015
2 parents e83be0d + 28320c4 commit c146976
Show file tree
Hide file tree
Showing 11 changed files with 120 additions and 42 deletions.
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ These project may add auxiliary behavior or have yet to be merged into the Keycl

### Keycloak Spring Security Authentication

Provides an extension to Keycloak's Spring Security adapter that enables the authentication
via direct access grants.

### Keycloak Spring Security User Details

Provides an extension to Keycloak's Spring Security adapter that enables the authenticated
principal to be loaded from a Spring Security user detail service.

#### Usage
### Usage

[ ![Download](https://api.bintray.com/packages/smartling/release/keycloak-spring-security-auth/images/download.svg) ](https://bintray.com/smartling/release/keycloak-spring-security-auth/_latestVersion)

Expand All @@ -20,6 +25,13 @@ principal to be loaded from a Spring Security user detail service.
<artifactId>keycloak-spring-security-auth</artifactId>
<version>${version}</version>
</dependency>
<dependency>
<groupId>com.smartling.keycloak.extras</groupId>
<artifactId>keycloak-spring-security-user-details</artifactId>
<version>${version}</version>
</dependency>
```

## Using Smartling Keycloak Extras
Expand Down
8 changes: 7 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ buildscript {

group = 'com.smartling.keycloak.extras'
description = 'Smartling Keycloak Extras'
version = '0.4.0' + (project.hasProperty('release') && project.ext.release ? '-RELEASE' : '-SNAPSHOT')
version = '0.5.0' + (project.hasProperty('release') && project.ext.release ? '-RELEASE' : '-SNAPSHOT')

ext {
springVersion = '3.2.6.RELEASE'
Expand Down Expand Up @@ -113,6 +113,12 @@ subprojects {
}
}

project('keycloak-spring-security-user-details') {
description = "Keycloak Spring Security User Details Authentication Extras"
dependencies {
compile project(':keycloak-spring-security-auth')
}
}

task wrapper(type: Wrapper) {
gradleVersion = '2.2'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package org.keycloak.adapters.springsecurity.filter;

import org.keycloak.adapters.springsecurity.authentication.DirectAccessGrantAuthenticationProvider;
import org.keycloak.adapters.springsecurity.authentication.DirectAccessGrantUserDetailsAuthenticationProvider;
import org.keycloak.adapters.springsecurity.token.DirectAccessGrantToken;
import org.springframework.security.authentication.AuthenticationServiceException;
import org.springframework.security.core.Authentication;
Expand All @@ -34,7 +33,6 @@
* @author <a href="mailto:[email protected]">Scott Rossillo</a>
*
* @see DirectAccessGrantAuthenticationProvider
* @see DirectAccessGrantUserDetailsAuthenticationProvider
* @see UsernamePasswordAuthenticationFilter
*/
public class DirectAccessGrantLoginFilter extends UsernamePasswordAuthenticationFilter {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,11 @@
import org.keycloak.adapters.springsecurity.AdapterDeploymentContextBean;
import org.keycloak.adapters.springsecurity.KeycloakSecurityComponents;
import org.keycloak.adapters.springsecurity.authentication.DirectAccessGrantAuthenticationProvider;
import org.keycloak.adapters.springsecurity.authentication.DirectAccessGrantUserDetailsAuthenticationProvider;
import org.keycloak.adapters.springsecurity.service.DirectAccessGrantService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
* Spring integration test application configuration.
Expand Down Expand Up @@ -63,20 +52,4 @@ DirectAccessGrantAuthenticationProvider directAccessGrantAuthenticationProvider(
return provider;
}

@Bean
DirectAccessGrantUserDetailsAuthenticationProvider directAccessGrantUserDetailsAuthenticationProvider() {
DirectAccessGrantUserDetailsAuthenticationProvider provider = new DirectAccessGrantUserDetailsAuthenticationProvider();
provider.setAdapterDeploymentContextBean(adapterDeploymentContextBean());
provider.setDirectAccessGrantService(directAccessGrantService);
provider.setUserDetailsService(userDetailsService());
return provider;
}

@Bean
UserDetailsService userDetailsService() {
Set<UserDetails> users = new HashSet<>();
User user = new User(KNOWN_EMAIL, "does_not_matter", Arrays.asList(new SimpleGrantedAuthority("user")));
users.add(user);
return new InMemoryUserDetailsManager(Collections.unmodifiableCollection(users));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@
* limitations under the License.
*/

package org.keycloak.adapters.springsecurity.authentication;
package org.keycloak.adapters.springsecurity.userdetails.authentication;

import org.keycloak.KeycloakPrincipal;
import org.keycloak.adapters.KeycloakAccount;
import org.keycloak.adapters.springsecurity.authentication.DirectAccessGrantAuthenticationProvider;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.keycloak.adapters.springsecurity.token.KeycloakUserDetailsAuthenticationToken;
import org.keycloak.adapters.springsecurity.userdetails.token.KeycloakUserDetailsAuthenticationToken;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
Expand Down Expand Up @@ -50,7 +51,8 @@
* @see UserDetailsService#loadUserByUsername
* @see KeycloakUserDetailsAuthenticationToken
*/
public class DirectAccessGrantUserDetailsAuthenticationProvider extends DirectAccessGrantAuthenticationProvider {
public class DirectAccessGrantUserDetailsAuthenticationProvider extends DirectAccessGrantAuthenticationProvider
{

private UserDetailsService userDetailsService;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@
* limitations under the License.
*/

package org.keycloak.adapters.springsecurity.authentication;
package org.keycloak.adapters.springsecurity.userdetails.authentication;

import org.keycloak.KeycloakPrincipal;
import org.keycloak.adapters.KeycloakAccount;
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.keycloak.adapters.springsecurity.token.KeycloakUserDetailsAuthenticationToken;
import org.keycloak.adapters.springsecurity.userdetails.token.KeycloakUserDetailsAuthenticationToken;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@
* limitations under the License.
*/

package org.keycloak.adapters.springsecurity.token;
package org.keycloak.adapters.springsecurity.userdetails.token;

import org.keycloak.adapters.KeycloakAccount;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.util.Assert;
Expand All @@ -28,7 +29,8 @@
*
* @author <a href="mailto:[email protected]">Scott Rossillo</a>
*/
public class KeycloakUserDetailsAuthenticationToken extends KeycloakAuthenticationToken {
public class KeycloakUserDetailsAuthenticationToken extends KeycloakAuthenticationToken
{

private UserDetails userDetails;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
* limitations under the License.
*/

package org.keycloak.adapters.springsecurity.authentication;
package org.keycloak.adapters.springsecurity.userdetails.authentication;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.keycloak.adapters.springsecurity.config.AppConfig;
import org.keycloak.adapters.springsecurity.userdetails.config.AppConfig;
import org.keycloak.adapters.springsecurity.token.DirectAccessGrantToken;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@
* limitations under the License.
*/

package org.keycloak.adapters.springsecurity.authentication;
package org.keycloak.adapters.springsecurity.userdetails.authentication;

import org.junit.Before;
import org.junit.Test;
import org.keycloak.adapters.KeycloakAccount;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.keycloak.adapters.springsecurity.token.KeycloakUserDetailsAuthenticationToken;
import org.keycloak.adapters.springsecurity.userdetails.token.KeycloakUserDetailsAuthenticationToken;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* Copyright 2015 Smartling, Inc.
*
* 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.
*/

package org.keycloak.adapters.springsecurity.userdetails.config;

import org.keycloak.adapters.springsecurity.AdapterDeploymentContextBean;
import org.keycloak.adapters.springsecurity.KeycloakSecurityComponents;
import org.keycloak.adapters.springsecurity.authentication.DirectAccessGrantAuthenticationProvider;
import org.keycloak.adapters.springsecurity.userdetails.authentication.DirectAccessGrantUserDetailsAuthenticationProvider;
import org.keycloak.adapters.springsecurity.service.DirectAccessGrantService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
* Spring integration test application configuration.
*/
@Configuration
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class AppConfig
{

public static final String KNOWN_EMAIL = "[email protected]";
public static final String KNOWN_USERNAME = "srossillo";
public static final String KNOWN_PASSWORD = "password";

@Autowired
protected DirectAccessGrantService directAccessGrantService;

@Bean
AdapterDeploymentContextBean adapterDeploymentContextBean() {
return new AdapterDeploymentContextBean();
}

@Bean
DirectAccessGrantAuthenticationProvider directAccessGrantAuthenticationProvider() {
DirectAccessGrantAuthenticationProvider provider = new DirectAccessGrantAuthenticationProvider();
provider.setAdapterDeploymentContextBean(adapterDeploymentContextBean());
provider.setDirectAccessGrantService(directAccessGrantService);
return provider;
}

@Bean
DirectAccessGrantUserDetailsAuthenticationProvider directAccessGrantUserDetailsAuthenticationProvider() {
DirectAccessGrantUserDetailsAuthenticationProvider provider = new DirectAccessGrantUserDetailsAuthenticationProvider();
provider.setAdapterDeploymentContextBean(adapterDeploymentContextBean());
provider.setDirectAccessGrantService(directAccessGrantService);
provider.setUserDetailsService(userDetailsService());
return provider;
}

@Bean
UserDetailsService userDetailsService() {
Set<UserDetails> users = new HashSet<>();
User user = new User(KNOWN_EMAIL, "does_not_matter", Arrays.asList(new SimpleGrantedAuthority("user")));
users.add(user);
return new InMemoryUserDetailsManager(Collections.unmodifiableCollection(users));
}
}
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@
rootProject.name = 'smartling-keycloak-extras'

include 'keycloak-spring-security-auth'
include 'keycloak-spring-security-user-details'
//include 'spring-boot-starter-keycloak'

0 comments on commit c146976

Please sign in to comment.