Skip to content

Commit 6da4bd8

Browse files
committed
initial commit
0 parents  commit 6da4bd8

14 files changed

+475
-0
lines changed

.classpath

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<classpath>
3+
<classpathentry kind="src" path="grails-app/conf"/>
4+
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
5+
<classpathentry kind="con" path="com.springsource.sts.grails.core.CLASSPATH_CONTAINER"/>
6+
<classpathentry kind="src" path="spring-security-core-0.4.1-grails-app-conf">
7+
<attributes>
8+
<attribute name="com.springsource.sts.grails.core.SOURCE_FOLDER" value="true"/>
9+
</attributes>
10+
</classpathentry>
11+
<classpathentry kind="src" path="spring-security-core-0.4.1-grails-app-services">
12+
<attributes>
13+
<attribute name="com.springsource.sts.grails.core.SOURCE_FOLDER" value="true"/>
14+
</attributes>
15+
</classpathentry>
16+
<classpathentry kind="src" path="spring-security-core-0.4.1-grails-app-taglib">
17+
<attributes>
18+
<attribute name="com.springsource.sts.grails.core.SOURCE_FOLDER" value="true"/>
19+
</attributes>
20+
</classpathentry>
21+
<classpathentry kind="src" path="spring-security-core-0.4.1-src-java">
22+
<attributes>
23+
<attribute name="com.springsource.sts.grails.core.SOURCE_FOLDER" value="true"/>
24+
</attributes>
25+
</classpathentry>
26+
<classpathentry kind="src" path="spring-security-core-0.4.1-src-groovy">
27+
<attributes>
28+
<attribute name="com.springsource.sts.grails.core.SOURCE_FOLDER" value="true"/>
29+
</attributes>
30+
</classpathentry>
31+
<classpathentry kind="output" path="target/eclipseclasses"/>
32+
</classpath>

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/target
2+
/grails-spring-security-oauth-consumer-*.zip
3+
/plugin.xml

.project

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<projectDescription>
3+
<name>grails-spring-security-oauth-consumer</name>
4+
<comment></comment>
5+
<projects>
6+
</projects>
7+
<buildSpec>
8+
<buildCommand>
9+
<name>org.eclipse.jdt.core.javabuilder</name>
10+
<arguments>
11+
</arguments>
12+
</buildCommand>
13+
</buildSpec>
14+
<natures>
15+
<nature>com.springsource.sts.grails.core.nature</nature>
16+
<nature>org.eclipse.jdt.groovy.core.groovyNature</nature>
17+
<nature>org.eclipse.jdt.core.javanature</nature>
18+
</natures>
19+
<linkedResources>
20+
<link>
21+
<name>spring-security-core-0.4.1-grails-app-conf</name>
22+
<type>2</type>
23+
<locationURI>DOTGRAILS/1.2.3/projects/spring-security-oauth-consumer/plugins/spring-security-core-0.4.1/grails-app/conf</locationURI>
24+
</link>
25+
<link>
26+
<name>spring-security-core-0.4.1-grails-app-services</name>
27+
<type>2</type>
28+
<locationURI>DOTGRAILS/1.2.3/projects/spring-security-oauth-consumer/plugins/spring-security-core-0.4.1/grails-app/services</locationURI>
29+
</link>
30+
<link>
31+
<name>spring-security-core-0.4.1-grails-app-taglib</name>
32+
<type>2</type>
33+
<locationURI>DOTGRAILS/1.2.3/projects/spring-security-oauth-consumer/plugins/spring-security-core-0.4.1/grails-app/taglib</locationURI>
34+
</link>
35+
<link>
36+
<name>spring-security-core-0.4.1-src-groovy</name>
37+
<type>2</type>
38+
<locationURI>DOTGRAILS/1.2.3/projects/spring-security-oauth-consumer/plugins/spring-security-core-0.4.1/src/groovy</locationURI>
39+
</link>
40+
<link>
41+
<name>spring-security-core-0.4.1-src-java</name>
42+
<type>2</type>
43+
<locationURI>DOTGRAILS/1.2.3/projects/spring-security-oauth-consumer/plugins/spring-security-core-0.4.1/src/java</locationURI>
44+
</link>
45+
</linkedResources>
46+
</projectDescription>

.settings/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/com.springsource.sts.grails.core.prefs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#Created by grails
2+
eclipse.preferences.version=1
3+
groovy.dont.generate.class.files=true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
/* Copyright 2006-2010 the original author or authors.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
import org.codehaus.groovy.grails.plugins.springsecurity.SecurityFilterPosition
16+
import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
17+
18+
import org.springframework.security.access.ConfigAttribute
19+
import org.springframework.security.access.SecurityConfig
20+
import org.springframework.security.oauth.common.signature.CoreOAuthSignatureMethodFactory
21+
import org.springframework.security.oauth.common.signature.HMAC_SHA1SignatureMethod
22+
import org.springframework.security.oauth.common.signature.SharedConsumerSecret
23+
import org.springframework.security.oauth.consumer.BaseProtectedResourceDetails
24+
import org.springframework.security.oauth.consumer.CoreOAuthConsumerSupport
25+
import org.springframework.security.oauth.consumer.InMemoryProtectedResourceDetailsService
26+
import org.springframework.security.oauth.consumer.OAuthConsumerProcessingFilter
27+
import org.springframework.security.oauth.consumer.net.DefaultOAuthURLStreamHandlerFactory
28+
import org.springframework.security.oauth.consumer.nonce.UUIDNonceFactory
29+
import org.springframework.security.oauth.consumer.token.HttpSessionBasedTokenServicesFactory
30+
import org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource
31+
import org.springframework.security.web.access.intercept.RequestKey
32+
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint
33+
import org.springframework.security.web.util.AntUrlPathMatcher
34+
import org.springframework.security.web.util.RegexUrlPathMatcher
35+
import org.springframework.util.StringUtils
36+
37+
class SpringSecurityOauthConsumerGrailsPlugin {
38+
39+
String version = '0.1'
40+
String grailsVersion = '1.2.2 > *'
41+
Map dependsOn = ['springSecurityCore': '0.4 > *']
42+
43+
List pluginExcludes = [
44+
'docs/**',
45+
'src/docs/**'
46+
]
47+
48+
String author = 'Burt Beckwith'
49+
String authorEmail = '[email protected]'
50+
String title = 'OAuth Consumer support for the Spring Security plugin.'
51+
String description = 'OAuth Consumer support for the Spring Security plugin.'
52+
53+
String documentation = 'http://grails.org/plugin/spring-security-oauth-consumer'
54+
55+
def doWithSpring = {
56+
57+
def conf = SpringSecurityUtils.securityConfig
58+
if (!conf || !conf.active) {
59+
return
60+
}
61+
62+
println 'Configuring Spring Security OAuth Consumer ...'
63+
64+
SpringSecurityUtils.loadSecondaryConfig 'DefaultOAuthConsumerSecurityConfig'
65+
// have to get again after overlaying DefaultOAuthConsumerSecurityConfig
66+
conf = SpringSecurityUtils.securityConfig
67+
68+
SpringSecurityUtils.registerFilter 'oauthConsumerFilter',
69+
SecurityFilterPosition.LAST.order - 1
70+
71+
def resources = parseResources(conf)
72+
oauthProtectedResourceDetailsService(InMemoryProtectedResourceDetailsService) {
73+
resourceDetailsStore = resources
74+
}
75+
76+
oauthSignatureMethodFactory(CoreOAuthSignatureMethodFactory) {
77+
supportPlainText = conf.oauthConsumer.signature.supportPlainText // false
78+
supportHMAC_SHA1 = conf.oauthConsumer.signature.supportHMAC_SHA1 // true
79+
supportRSA_SHA1 = conf.oauthConsumer.signature.supportRSA_SHA1 // true
80+
}
81+
82+
oauthNonceFactory(UUIDNonceFactory)
83+
84+
oauthStreamHandlerFactory(DefaultOAuthURLStreamHandlerFactory)
85+
86+
oauthProxySelector(ProxySelector) { bean ->
87+
bean.factoryMethod = 'getDefault'
88+
}
89+
90+
oauthConsumerSupport(CoreOAuthConsumerSupport) {
91+
connectionTimeout = conf.oauthConsumer.protectedResource.connectionTimeout // 1000 * 60
92+
readTimeout = conf.oauthConsumer.protectedResource.readTimeout // 1000 * 60
93+
signatureFactory = ref('oauthSignatureMethodFactory')
94+
protectedResourceDetailsService = ref('oauthProtectedResourceDetailsService')
95+
nonceFactory = ref('oauthNonceFactory')
96+
streamHandlerFactory = ref('oauthStreamHandlerFactory')
97+
proxySelector = ref('oauthProxySelector')
98+
}
99+
100+
oauthTokenServicesFactory(HttpSessionBasedTokenServicesFactory)
101+
102+
oauthFailureEntryPoint(LoginUrlAuthenticationEntryPoint) {
103+
forceHttps = conf.auth.forceHttps // false
104+
useForward = conf.auth.useForward // false
105+
loginFormUrl = conf.oauthConsumer.failurePage
106+
portMapper = ref('portMapper')
107+
portResolver = ref('portResolver')
108+
}
109+
110+
String pathType = conf.oauthConsumer.ods.pathType // 'ant'
111+
def urlMatcher = 'ant'.equals(pathType) ? new AntUrlPathMatcher() : new RegexUrlPathMatcher()
112+
urlMatcher.requiresLowerCaseUrl = conf.oauthConsumer.ods.lowercaseComparisons // true
113+
114+
LinkedHashMap<RequestKey, Collection<ConfigAttribute>> invocationDefinitionMap = [:]
115+
for (Map<String, String> map : conf.oauthConsumer.ods.urls) {
116+
String path = map.pattern
117+
if (conf.oauthConsumer.ods.lowercaseComparisons) {
118+
path = path.toLowerCase()
119+
}
120+
if (map.resources) {
121+
invocationDefinitionMap[new RequestKey(path, map.httpMethod ?: null)] = SecurityConfig.createList(
122+
StringUtils.commaDelimitedListToStringArray(map.resources))
123+
}
124+
}
125+
126+
oauthObjectDefinitionSource(DefaultFilterInvocationSecurityMetadataSource, urlMatcher, invocationDefinitionMap)
127+
128+
oauthConsumerFilter(OAuthConsumerProcessingFilter) {
129+
protectedResourceDetailsService = ref('oauthProtectedResourceDetailsService')
130+
OAuthFailureEntryPoint = ref('oauthFailureEntryPoint')
131+
tokenServicesFactory = ref('oauthTokenServicesFactory')
132+
objectDefinitionSource = ref('oauthObjectDefinitionSource')
133+
consumerSupport = ref('oauthConsumerSupport')
134+
portResolver = ref('portResolver')
135+
requireAuthenticated = conf.oauthConsumer.consumerFilter.requireAuthenticated // true
136+
accessTokensRequestAttribute = conf.oauthConsumer.consumerFilter.accessTokensRequestAttribute // 'OAUTH_ACCESS_TOKENS'
137+
}
138+
}
139+
140+
private Map<String, BaseProtectedResourceDetails> parseResources(conf) {
141+
Map<String, BaseProtectedResourceDetails> resources = new TreeMap<String, BaseProtectedResourceDetails>()
142+
143+
for (Map<String, Object> resourceDef in conf.oauthConsumer.resourceDefs) {
144+
BaseProtectedResourceDetails resource = new BaseProtectedResourceDetails()
145+
146+
setIfString 'id', resourceDef, resource, 'A resource id'
147+
setIfString 'consumerKey', resourceDef, resource, 'A consumer key'
148+
setIfString 'requestTokenURL', resourceDef, resource, 'A request token URL'
149+
setIfString 'accessTokenURL', resourceDef, resource, 'An access token URL'
150+
setIfString 'accessTokenHttpMethod', resourceDef, resource
151+
setIfString 'userAuthorizationURL', resourceDef, resource, 'A user authorization URL'
152+
setIfString 'authorizationHeaderRealm' , resourceDef, resource
153+
setIfBoolean 'acceptsAuthorizationHeader', resourceDef, resource
154+
setIfBoolean 'use10a', resourceDef, resource
155+
156+
def secret = resourceDef.secret
157+
if (secret instanceof String && secret) {
158+
resource.sharedSecret = new SharedConsumerSecret(secret)
159+
}
160+
else {
161+
error "A shared secret must be supplied with the definition of a resource: $resourceDef"
162+
}
163+
164+
def signatureMethod = resourceDef.signatureMethod
165+
if (!(signatureMethod instanceof String && signatureMethod)) {
166+
signatureMethod = HMAC_SHA1SignatureMethod.SIGNATURE_NAME
167+
}
168+
resource.signatureMethod = signatureMethod
169+
170+
def additionalParameters = resourceDef.addtionalParameters
171+
if (additionalParameters instanceof Map && additionalParameters) {
172+
resource.additionalParameters = additionalParameters
173+
}
174+
175+
def additionalRequestHeaders = resourceDef.additionalRequestHeaders
176+
if (additionalRequestHeaders instanceof Map && additionalRequestHeaders) {
177+
resource.additionalRequestHeaders = additionalRequestHeaders
178+
}
179+
180+
resources[resourceDef.id] = resource
181+
}
182+
183+
resources
184+
}
185+
186+
private void setIfString(String attrName, Map<String, Object> resourceDef,
187+
BaseProtectedResourceDetails resource, String errorPrefix = null) {
188+
189+
def value = resourceDef."$attrName"
190+
if (value instanceof String && value) {
191+
resource."$attrName" = value
192+
return
193+
}
194+
195+
if (errorPrefix) {
196+
error "$errorPrefix must be supplied with the definition of a protected resource: $resourceDef"
197+
}
198+
}
199+
200+
private void setIfBoolean(String attrName, Map<String, Object> resourceDef, BaseProtectedResourceDetails resource) {
201+
def value = resourceDef."$attrName"
202+
if (value instanceof Boolean) {
203+
resource."$attrName" = value
204+
}
205+
}
206+
207+
private void error(String message) {
208+
// OAuth parser throws BeanDefinitionParsingException but Problem/Location aren't as necessary in Grails
209+
throw new RuntimeException(message)
210+
}
211+
}

application.properties

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#Grails Metadata file
2+
#Fri Jul 02 01:01:10 EDT 2010
3+
app.grails.version=1.2.3
4+
app.name=spring-security-oauth-consumer
5+
plugins.hibernate=1.2.3
6+
plugins.spring-security-core=0.4.1

0 commit comments

Comments
 (0)