SlideShare a Scribd company logo
1 of 66
Download to read offline
Hacking the Grails Spring
Security 2.0 Plugin
Burt Beckwith
Be sure to view last year's 
“What's New” talk
Video
Slides
Additionally, the earlier version 
of this talk from GGX 2011 is 
available; see this blog post for 
details and links
4CONFIDENTIAL 4CONFIDENTIAL 4
web.xml
web.xml
● Spring Security is implemented as a filter chain, so the
<filter-mapping> elements are the important ones:
● charEncodingFilter
● hiddenHttpMethod
● AssetPipelineFilter
● grailsWebRequest
● springSecurityFilterChain
● urlMapping
● grailsCacheFilter
web.xml
● Spring Security is implemented as a filter chain, so the
<filter-mapping> elements are the important ones:
● charEncodingFilter
● hiddenHttpMethod
● AssetPipelineFilter
● grailsWebRequest
● springSecurityFilterChain
● urlMapping
● grailsCacheFilter
web.xml - charEncodingFilter
Prevents this
●
org.springframework.web.filter.DelegatingFilterProxy
● Uses the "characterEncodingFilter" bean
(org.springframework.web.filter.CharacterEncodingFilter)
defined in WEB-INF/applicationContext.xml (the
“parent” context)
● request.setCharacterEncoding("utf-8");
● response.setCharacterEncoding("utf-8");
web.xml - hiddenHttpMethod
String httpMethod = getHttpMethodOverride(request);
filterChain.doFilter(
new HttpMethodRequestWrapper(httpMethod, request),
response);
●
org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter
● <g:form controller="book" method="DELETE">
● See the section on REST in the Grails reference docs
web.xml - AssetPipelineFilter
● asset.pipeline.grails.AssetPipelineFilter
● Manages minification, etc. for the asset-pipeline plugin(s)
web.xml - grailsWebRequest
●
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter
LocaleContextHolder.setLocale(request.getLocale());
GrailsWebRequest webRequest = new GrailsWebRequest(
request, response, getServletContext());
configureParameterCreationListeners(webRequest);
try {
WebUtils.storeGrailsWebRequest(webRequest);
// Set the flash scope instance to its next state
FlashScope fs = webRequest.getAttributes().getFlashScope(request);
fs.next();
filterChain.doFilter(request, response);
}
finally {
webRequest.requestCompleted();
WebUtils.clearGrailsWebRequest();
LocaleContextHolder.setLocale(null);
}
web.xml - springSecurityFilterChain
●
org.springframework.web.filter.DelegatingFilterProxy
● Uses the "springSecurityFilterChain" bean defined by
the plugin
(org.springframework.security.web.FilterChainProxy)
web.xml - springSecurityFilterChain
● Typical filter beans:
●
securityContextPersistenceFilter
● logoutFilter
● authenticationProcessingFilter
● securityContextHolderAwareRequestFilter
●
rememberMeAuthenticationFilter
● anonymousAuthenticationFilter
● exceptionTranslationFilter
●
filterInvocationInterceptor
web.xml - urlMapping
●
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter
● Matches requested url to the correct
controller/action/view/error code
● Based on mappings in grails-app/conf/UrlMappings.groovy
web.xml - grailsCacheFilter
●
org.springframework.web.filter.DelegatingFilterProxy
● Uses the "grailsCacheFilter" bean
(MemoryPageFragmentCachingFilter /
EhcachePageFragmentCachingFilter / etc.)
● Entry point for controller and GSP fragment caching in the
cache plugins
springSecurityFilterChain
springSecurityFilterChain - securityContextPersistenceFilter
●
org.springframework.security.web.context.SecurityContextPersistenceFilter
● Retrieves the SecurityContext from the HTTP session
(under the “SPRING_SECURITY_CONTEXT” key) or creates
a new empty one
●
Stores the context in the holder:
SecurityContextHolder.setContext()
● Removes the context at the end of the request
springSecurityFilterChain - logoutFilter
●
grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
● If uri is "/j_spring_security_logout" calls
handler.logout(request, response, auth) for each
o.s.s.web.authentication.logout.LogoutHandler and
redirects to post-logout url (by default "/")
springSecurityFilterChain - authenticationProcessingFilter
●
grails.plugin.springsecurity.web.authentication.RequestHolderAuthenticationFilter
(extends o.s.s.web.authentication.UsernamePasswordAuthenticationFilter)
● Sets the request and response in the SecurityRequestHolder
ThreadLocal fields (custom plugin functionality)
● If uri is “/j_spring_security_check” calls
attemptAuthentication()
● The request and response holder functionality will be in its own filter for the
2.0 GA release
springSecurityFilterChain - anonymousAuthenticationFilter
●
grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
● If not logged in creates a
grails.plugin.springsecurity.authentication.GrailsAnonymousAuthenticationToken
and registers it as the Authentication
in the SecurityContext
● This is a plugin-specific implementation
that always creates an Authentication
with a Principal that implements
UserDetails (not a f!@#*u$ng String)
springSecurityFilterChain - filterInvocationInterceptor
●
o.s.s.web.access.intercept.FilterSecurityInterceptor
● Determines the o.s.s.access.SecurityConfig
collection for the request from the o.s.s.web.access.intercept.
FilterInvocationSecurityMetadataSource
(AnnotationFilterInvocationDefinition,
InterceptUrlMapFilterInvocationDefinition, or
RequestmapFilterInvocationDefinition)
springSecurityFilterChain - filterInvocationInterceptor
● Delegates to an AccessDecisionManager
(grails.plugin.springsecurity.access.vote.
AuthenticatedVetoableDecisionManager) to call
each registered
o.s.s.access.AccessDecisionVoter
springSecurityFilterChain - filterInvocationInterceptor
● o.s.s.access.vote.AuthenticatedVoter works
with "IS_AUTHENTICATED_FULLY",
"IS_AUTHENTICATED_REMEMBERED", and
"IS_AUTHENTICATED_ANONYMOUSLY"
springSecurityFilterChain - filterInvocationInterceptor
● o.s.s.access.vote.RoleHierarchyVoter finds
the GrantedAuthority instances from the
Authentication, checks for matches with required
roles
springSecurityFilterChain - filterInvocationInterceptor
● grails.plugin.springsecurity.web.access.expression.
WebExpressionVoter looks for a
WebExpressionConfigAttribute and evaluates its
expression if found
● grails.plugin.springsecurity.access.vote.
ClosureVoter looks for a Closure and invokes it to
determine how to vote
springSecurityFilterChain - filterInvocationInterceptor
● This is caught by the exceptionTranslationFilter
● If the Authentication is anonymous, stores a
SavedRequest in the HTTP session and calls
authenticationEntryPoint.commence(request,
response, reason)
● The authenticationEntryPoint is a
grails.plugin.springsecurity.web.authentication.
AjaxAwareAuthenticationEntryPoint
● This issues a redirect to the login page, by default
/login/auth
if (denyCount > 0) {
throw new AccessDeniedException("Access is denied");
}
Customizing the Plugin
Customizing the Plugin
● Simple; not always clear how to customize; many
options aren't exposed
● In contrast, the plugin explicitly defines every bean and
exposes nearly all properties
● See SpringSecurityCoreGrailsPlugin.groovy
for the details
Overriding Beans
Overriding Beans
accessDecisionManager
accessDeniedHandler
anonymousAuthenticationFilter
anonymousAuthenticationProvider
authenticatedVoter
authenticationDetailsSource
authenticationEntryPoint
authenticationEventPublisher
authenticationFailureHandler
authenticationManager
authenticationProcessingFilter
authenticationSuccessHandler
authenticationTrustResolver
authenticationUserDetailsService
daoAuthenticationProvider
exceptionTranslationFilter
filterInvocationInterceptor
logoutFilter
logoutHandlers
logoutSuccessHandler
objectDefinitionSource
passwordEncoder
portMapper
portResolver
postAuthenticationChecks
preAuthenticationChecks
redirectStrategy
rememberMeAuthenticationFilter
rememberMeAuthenticationProvider
rememberMeServices
requestCache
roleHierarchy
roleVoter
runAsManager
saltSource
securityContextHolderAwareRequestFilter
securityContextLogoutHandler
securityContextPersistenceFilter
securityEventListener
sessionAuthenticationStrategy
springSecurityFilterChain
tokenRepository
userCache
userDetailsService
webExpressionHandler
webExpressionVoter
webInvocationPrivilegeEvaluator
Overriding Beans
● Building the Spring ApplicationContext
Core pluginsCore plugins Installed pluginsInstalled plugins resources.groovyresources.groovy
Overriding Beans
● Gross oversimplifications:
● The ApplicationContext is like a Map; the keys are
bean names and the values are bean instances
● Defining a bean with the same name as an earlier bean
replaces the previous, just like Map.put(key,
value) does
Overriding Beans
● Gross oversimplifications:
● The ApplicationContext is like a Map; the keys are
bean names and the values are bean instances
● Defining a bean with the same name as an earlier bean
replaces the previous, just like Map.put(key,
value) does
Overriding Beans
● To change how a bean works:
● Subclass the current class
● Or subclass a similar class that's closer to what you need
●
Or implement the interface directly
● Then register yours in grails-app/
conf/spring/resources.groovy
Overriding Beans
import com.foo.bar.MySaltSource
import com.foo.bar.MyUserDetailsService
import com.foo.bar.MyPasswordEncoder
beans = {
saltSource(MySaltSource) {
// bean properties
}
userDetailsService(MyUserDetailsService) {
// bean properties
}
passwordEncoder(MyPasswordEncoder) {
// bean properties
}
}
Customizing Bean Properties
Customizing Bean Properties
● In addition to declaring every bean, nearly all properties
are configured from default values in the plugin's
grails-
app/conf/DefaultSecurityConfig.groovy
● DO NOT EDIT DefaultSecurityConfig.groovy
Customizing Bean Properties
● All properties can be overridden in your app's
Config.groovy
● Be sure to add the grails.plugin.springsecurity
prefix
●
Don't replace a bean if all you need to change is one or
more properties
Customizing Bean Properties
active
adh.ajaxErrorPage
adh.errorPage
ajaxHeader
anon.key
anon.userAttribute
apf.allowSessionCreation
apf.continueChainBeforeSuccessfulAuthentication
apf.filterProcessesUrl
apf.passwordParameter
apf.postOnly
apf.usernameParameter
atr.anonymousClass
atr.rememberMeClass
auth.ajaxLoginFormUrl
auth.forceHttps
auth.loginFormUrl
auth.useForward
authenticationDetails.authClass
authority.className
authority.nameField
basic.realmName
cacheUsers
controllerAnnotations.lowercase
controllerAnnotations.matcher
controllerAnnotations.staticRules
dao.hideUserNotFoundExceptions
dao.reflectionSaltSourceProperty
digest.createAuthenticatedToken
digest.key
digest.nonceValiditySeconds
digest.passwordAlreadyEncoded
digest.realmName
digest.useCleartextPasswords
failureHandler.ajaxAuthFailUrl
failureHandler.defaultFailureUrl
failureHandler.exceptionMappings
failureHandler.useForward
filterChain.stripQueryStringFromUrls
interceptUrlMap
ipRestrictions
logout.afterLogoutUrl
logout.filterProcessesUrl
logout.handlerNames
password.algorithm
password.bcrypt.logrounds
password.encodeHashAsBase64
portMapper.httpPort
portMapper.httpsPort
providerManager.eraseCredentialsAfterAuthentication
providerNames
redirectStrategy.contextRelative
registerLoggerListener
rejectIfNoRule
rememberMe.alwaysRemember
rememberMe.cookieName
rememberMe.key
rememberMe.parameter
rememberMe.persistent
rememberMe.persistentToken.domainClassName
rememberMe.persistentToken.seriesLength
rememberMe.persistentToken.tokenLength
rememberMe.tokenValiditySeconds
rememberMe.useSecureCookie
requestCache.createSession
requestCache.onlyOnGet
requestMap.className
requestMap.configAttributeField
requestMap.urlField
roleHierarchy
secureChannel.definition
securityConfigType
sessionFixationPrevention.alwaysCreateSession
sessionFixationPrevention.migrate
successHandler.ajaxSuccessUrl
successHandler.alwaysUseDefault
successHandler.defaultTargetUrl
successHandler.targetUrlParameter
successHandler.useReferer
switchUser.exitUserUrl
switchUser.switchFailureUrl
switchUser.switchUserUrl
switchUser.targetUrl
useBasicAuth
useDigestAuth
useHttpSessionEventPublisher
userLookup.accountExpiredPropertyName
userLookup.accountLockedPropertyName
userLookup.authoritiesPropertyName
userLookup.authorityJoinClassName
userLookup.enabledPropertyName
userLookup.passwordExpiredPropertyName
userLookup.passwordPropertyName
userLookup.userDomainClassName
userLookup.usernamePropertyName
useSecurityEventListener
useSessionFixationPrevention
useSwitchUserFilter
useX509
voterNames
x509.checkForPrincipalChanges
x509.continueFilterChainOnUnsuccessfulAuthentication
x509.invalidateSessionOnPrincipalChange
x509.subjectDnRegex
x509.throwExceptionWhenTokenRejected
Customizing Bean Properties
grails-app/conf/Config.groovy:
grails.plugin.springsecurity.userLookup.userDomainClassName = '…'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = '…'
grails.plugin.springsecurity.authority.className = '…'
grails.plugin.springsecurity.auth.loginFormUrl = '/log-in'
grails.plugin.springsecurity.apf.filterProcessesUrl = '/authenticate'
grails.plugin.springsecurity.logout.afterLogoutUrl = '/home'
grails.plugin.springsecurity.userLookup.usernamePropertyName = 'email'
Customizing Bean Properties
class BootStrap {
def authenticationProcessingFilter
def myAuthenticationFailureHandler
def init = {
authenticationProcessingFilter.authenticationFailureHandler =
myAuthenticationFailureHandler
}
}
● Can also configure beans in BootStrap.groovy, e.g. to
avoid redefining a whole bean in resources.groovy just
to change one dependency:
Custom UserDetailsService
Custom UserDetailsService
● Very common customization
●
Documented in the plugin docs in section
“Custom UserDetailsService”
Custom UserDetailsService
● General workflow:
● Create a custom
o.s.s.core.userdetails.UserDetailsService
(grails.plugin.springsecurity.userdetails.
GrailsUserDetailsService) implementation
● Directly implement the interface (best)
● or extend grails.plugin.springsecurity.userdetails.
GormUserDetailsService (ok, but usually cleaner to implement
the interface)
Custom UserDetailsService
● General workflow (cont.):
● Create a custom implementation of
o.s.s.core.userdetails.UserDetails
● Extend
grails.plugin.springsecurity.userdetails.GrailsUser
● or extend o.s.s.core.userdetails.User
● or directly implement the interface
Custom UserDetailsService
● General workflow (cont.):
● Register the bean override in grails-
app/conf/spring/resources.groovy:
import com.mycompany.myapp.MyUserDetailsService
beans = {
userDetailsService(MyUserDetailsService)
}
Custom AuthenticationProvider
Custom AuthenticationProvider
● General workflow:
● Create a custom
o.s.s.authentication.AuthenticationProvider
implementation
● Extend one that's similar, e.g.
o.s.s.authentication.dao.DaoAuthenticationProvider
● or directly implement the interface
Custom AuthenticationProvider
● General workflow (cont.):
● You'll probably want a custom
org.springframework.security.core.Authentication
● Extend an existing implementation, e.g.
o.s.s.authentication.UsernamePasswordAuthenticationToken
● or directly implement the interface
Custom AuthenticationProvider
● General workflow (cont.):
● If you're using a custom Authentication, you'll need a filter to
create it
● Create a custom javax.servlet.Filter implementation
● Best to extend org.springframework.web.filter.GenericFilterBean
● or one that's similar, e.g.
o.s.s.web.authentication.UsernamePasswordAuthenticationFilter
● Or directly implement the interface
Custom AuthenticationProvider
● Registering the custom classes
● If you're replacing functionality, register bean overrides in
resources.groovy
● If you're adding an alternate authentication option (e.g. for only some
URLs)
● Register the beans in resources.groovy
● Register the provider as described in docs section “Authentication Providers”
●
Register the filter in its position as described in docs section “Filters”
Custom Post-logout Behavior
Custom Post-logout Behavior
● Recall that logout is processed by MutableLogoutFilter
after request for /j_spring_security_logout
● handler.logout(request, response, auth) is
called for each LogoutHandler
● then redirect to post-logout url (by default “/”)
Custom Post-logout Behavior
● The default LogoutHandler implementations are
●
o.s.s.web.authentication.rememberme.TokenBasedRememberMeServices
● Deletes the remember-me cookie
●
o.s.s.web.authentication.logout.SecurityContextLogoutHandler
● Invalidates the HttpSession
● Removes the SecurityContext from the
SecurityContextHolder
Custom Post-logout Behavior
● Redirect is triggered by
● logoutSuccessHandler.onLogoutSuccess(request,
response, auth)
● LogoutSuccessHandler is an instance of
o.s.s.web.authentication.logout.SimpleUrlLogoutSuccessHandler
Custom Post-logout Behavior
● To add logic to dynamically determine redirect url:
● Subclass SimpleUrlLogoutSuccessHandler
● Since the Authentication isn't available in
determineTargetUrl, override onLogoutSuccess and set it
in a ThreadLocal
Custom Post-logout Behavior
● To add logic to dynamically determine redirect url (cont):
private static final ThreadLocal<Authentication> AUTH_HOLDER =
new ThreadLocal<Authentication>()
…
void onLogoutSuccess(...) throws ... {
AUTH_HOLDER.set authentication
try {
super.handle(request, response, authentication)
}
finally {
AUTH_HOLDER.remove()
}
}
Custom Post-logout Behavior
● To add logic to dynamically determine redirect url (cont):
● Override determineTargetUrl
protected String determineTargetUrl(...) {
Authentication auth = AUTH_HOLDER.get()
String url = super.determineTargetUrl(request, response)
if (auth instanceof OrganizationAuthentication) {
OrganizationAuthentication authentication = auth
url = ...
}
url
}
Custom Post-logout Behavior
● To add logic to dynamically determine redirect url (cont):
● Redefine the logoutSuccessHandler bean in resources.groovy
import com.mycompany.myapp.CustomLogoutSuccessHandler
import grails.plugin.springsecurity.SpringSecurityUtils
beans = {
def conf = SpringSecurityUtils.securityConfig
logoutSuccessHandler(CustomLogoutSuccessHandler) {
redirectStrategy = ref('redirectStrategy')
defaultTargetUrl = conf.logout.afterLogoutUrl
alwaysUseDefaultTargetUrl = conf.logout.alwaysUseDefaultTargetUrl
targetUrlParameter = conf.logout.targetUrlParameter
useReferer = conf.logout.redirectToReferer
}
}
Customization Overview
Customization Overview
● Subclass or replace filters in the chain:
● SecurityContextPersistenceFilter
● MutableLogoutFilter
● RequestHolderAuthenticationFilter
(UsernamePasswordAuthenticationFilter)
● SecurityContextHolderAwareRequestFilter
● RememberMeAuthenticationFilter
● AnonymousAuthenticationFilter
● ExceptionTranslationFilter
● FilterSecurityInterceptor
Customization Overview
● Remove filter(s) from the chain
● Not recommended
● Add filter(s) to the chain
● Add/remove/replace LogoutHandler(s)
● Add/remove/replace AccessDecisionVoter(s)
● Add/remove/replace AuthenticationProvider(s)
Customization Overview
● Customize a filter or AuthenticationProvider's dependency
● e.g. custom UserDetailsService
● Don't write code if you can customize properties or
BootStrap.groovy
● Read the Spring Security documentation
● Print the PDF and read it on your commute
● Ask for help on the Grails User mailing list
¡Gracias!
http://cuteoverload.files.wordpress.com/2014/03/cute-smiling-animals-251.jpg

More Related Content

What's hot

[OPD 2019] Trusted types and the end of DOM XSS
[OPD 2019] Trusted types and the end of DOM XSS[OPD 2019] Trusted types and the end of DOM XSS
[OPD 2019] Trusted types and the end of DOM XSS
OWASP
 

What's hot (20)

Keycloak Single Sign-On
Keycloak Single Sign-OnKeycloak Single Sign-On
Keycloak Single Sign-On
 
Enterprise Security mit Spring Security
Enterprise Security mit Spring SecurityEnterprise Security mit Spring Security
Enterprise Security mit Spring Security
 
ApacheCon 2014: Infinite Session Clustering with Apache Shiro & Cassandra
ApacheCon 2014: Infinite Session Clustering with Apache Shiro & CassandraApacheCon 2014: Infinite Session Clustering with Apache Shiro & Cassandra
ApacheCon 2014: Infinite Session Clustering with Apache Shiro & Cassandra
 
W3 conf hill-html5-security-realities
W3 conf hill-html5-security-realitiesW3 conf hill-html5-security-realities
W3 conf hill-html5-security-realities
 
Getting Started with Spring Authorization Server
Getting Started with Spring Authorization ServerGetting Started with Spring Authorization Server
Getting Started with Spring Authorization Server
 
Modern Security with OAuth 2.0 and JWT and Spring by Dmitry Buzdin
Modern Security with OAuth 2.0 and JWT and Spring by Dmitry BuzdinModern Security with OAuth 2.0 and JWT and Spring by Dmitry Buzdin
Modern Security with OAuth 2.0 and JWT and Spring by Dmitry Buzdin
 
10 Excellent Ways to Secure Your Spring Boot Application - The Secure Develop...
10 Excellent Ways to Secure Your Spring Boot Application - The Secure Develop...10 Excellent Ways to Secure Your Spring Boot Application - The Secure Develop...
10 Excellent Ways to Secure Your Spring Boot Application - The Secure Develop...
 
Modern authentication in Sling with Openid Connect and Keycloak - Adapt.to 20...
Modern authentication in Sling with Openid Connect and Keycloak - Adapt.to 20...Modern authentication in Sling with Openid Connect and Keycloak - Adapt.to 20...
Modern authentication in Sling with Openid Connect and Keycloak - Adapt.to 20...
 
Understanding Windows Access Token Manipulation
Understanding Windows Access Token ManipulationUnderstanding Windows Access Token Manipulation
Understanding Windows Access Token Manipulation
 
Testing Android Security Codemotion Amsterdam edition
Testing Android Security Codemotion Amsterdam editionTesting Android Security Codemotion Amsterdam edition
Testing Android Security Codemotion Amsterdam edition
 
[OPD 2019] Trusted types and the end of DOM XSS
[OPD 2019] Trusted types and the end of DOM XSS[OPD 2019] Trusted types and the end of DOM XSS
[OPD 2019] Trusted types and the end of DOM XSS
 
[OPD 2019] Attacking JWT tokens
[OPD 2019] Attacking JWT tokens[OPD 2019] Attacking JWT tokens
[OPD 2019] Attacking JWT tokens
 
In The Middle of Printers - The (In)Security of Pull Printing solutions - Hac...
In The Middle of Printers - The (In)Security of Pull Printing solutions - Hac...In The Middle of Printers - The (In)Security of Pull Printing solutions - Hac...
In The Middle of Printers - The (In)Security of Pull Printing solutions - Hac...
 
Intrigue Core: Scaling Assessment Automation
Intrigue Core: Scaling Assessment AutomationIntrigue Core: Scaling Assessment Automation
Intrigue Core: Scaling Assessment Automation
 
What the Heck is OAuth and OpenID Connect? Connect.Tech 2017
What the Heck is OAuth and OpenID Connect? Connect.Tech 2017What the Heck is OAuth and OpenID Connect? Connect.Tech 2017
What the Heck is OAuth and OpenID Connect? Connect.Tech 2017
 
Building an API Security Ecosystem
Building an API Security EcosystemBuilding an API Security Ecosystem
Building an API Security Ecosystem
 
API Security : Patterns and Practices
API Security : Patterns and PracticesAPI Security : Patterns and Practices
API Security : Patterns and Practices
 
JavaOne 2014 - Securing RESTful Resources with OAuth2
JavaOne 2014 - Securing RESTful Resources with OAuth2JavaOne 2014 - Securing RESTful Resources with OAuth2
JavaOne 2014 - Securing RESTful Resources with OAuth2
 
What the Heck is OAuth and OpenID Connect - DOSUG 2018
What the Heck is OAuth and OpenID Connect - DOSUG 2018What the Heck is OAuth and OpenID Connect - DOSUG 2018
What the Heck is OAuth and OpenID Connect - DOSUG 2018
 
Spring4 security
Spring4 securitySpring4 security
Spring4 security
 

Viewers also liked

Viewers also liked (10)

Advanced GORM - Performance, Customization and Monitoring
Advanced GORM - Performance, Customization and MonitoringAdvanced GORM - Performance, Customization and Monitoring
Advanced GORM - Performance, Customization and Monitoring
 
Little Did He Know ...
Little Did He Know ...Little Did He Know ...
Little Did He Know ...
 
Grails Transactions
Grails TransactionsGrails Transactions
Grails Transactions
 
Grails Worst Practices
Grails Worst PracticesGrails Worst Practices
Grails Worst Practices
 
When the saints go marching in recorder
When the saints go marching in recorderWhen the saints go marching in recorder
When the saints go marching in recorder
 
Geb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosperGeb+spock: let your functional tests live long and prosper
Geb+spock: let your functional tests live long and prosper
 
De Java a Swift pasando por Groovy
De Java a Swift pasando por GroovyDe Java a Swift pasando por Groovy
De Java a Swift pasando por Groovy
 
GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)GriffDnie (Griffon Demo)
GriffDnie (Griffon Demo)
 
Macro macro, burrito burrit
Macro macro, burrito burritMacro macro, burrito burrit
Macro macro, burrito burrit
 
Spring security
Spring securitySpring security
Spring security
 

Similar to Hacking the Grails Spring Security 2.0 Plugin

securing-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdfsecuring-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdf
jcarrey
 
securing-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdfsecuring-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdf
jcarrey
 
TangoWithDjango - ch8
TangoWithDjango - ch8TangoWithDjango - ch8
TangoWithDjango - ch8
Asika Kuo
 

Similar to Hacking the Grails Spring Security 2.0 Plugin (20)

There and back again: A story of a s
There and back again: A story of a sThere and back again: A story of a s
There and back again: A story of a s
 
securing-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdfsecuring-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdf
 
securing-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdfsecuring-portlets-with-spring-security.pdf
securing-portlets-with-spring-security.pdf
 
Securing Portlets With Spring Security
Securing Portlets With Spring SecuritySecuring Portlets With Spring Security
Securing Portlets With Spring Security
 
CBSecurity 3 - Secure Your ColdBox Applications
CBSecurity 3 - Secure Your ColdBox ApplicationsCBSecurity 3 - Secure Your ColdBox Applications
CBSecurity 3 - Secure Your ColdBox Applications
 
Intro to Apache Shiro
Intro to Apache ShiroIntro to Apache Shiro
Intro to Apache Shiro
 
JavaOne 2009 BOF-5189 Griffon In Depth
JavaOne 2009 BOF-5189 Griffon In DepthJavaOne 2009 BOF-5189 Griffon In Depth
JavaOne 2009 BOF-5189 Griffon In Depth
 
Java EE Application Security With PicketLink
Java EE Application Security With PicketLinkJava EE Application Security With PicketLink
Java EE Application Security With PicketLink
 
Spring Security.ppt
Spring Security.pptSpring Security.ppt
Spring Security.ppt
 
Spring5 hibernate5 security5 lab step by step
Spring5 hibernate5 security5 lab step by stepSpring5 hibernate5 security5 lab step by step
Spring5 hibernate5 security5 lab step by step
 
TangoWithDjango - ch8
TangoWithDjango - ch8TangoWithDjango - ch8
TangoWithDjango - ch8
 
Apache Roller, Acegi Security and Single Sign-on
Apache Roller, Acegi Security and Single Sign-onApache Roller, Acegi Security and Single Sign-on
Apache Roller, Acegi Security and Single Sign-on
 
How many ways to monitor oracle golden gate-Collaborate 14
How many ways to monitor oracle golden gate-Collaborate 14How many ways to monitor oracle golden gate-Collaborate 14
How many ways to monitor oracle golden gate-Collaborate 14
 
Detecting headless browsers
Detecting headless browsersDetecting headless browsers
Detecting headless browsers
 
GDG Cloud Taipei: Meetup #52 - Istio Security: API Authorization
GDG Cloud Taipei: Meetup #52 - Istio Security: API AuthorizationGDG Cloud Taipei: Meetup #52 - Istio Security: API Authorization
GDG Cloud Taipei: Meetup #52 - Istio Security: API Authorization
 
Super simple application security with Apache Shiro
Super simple application security with Apache ShiroSuper simple application security with Apache Shiro
Super simple application security with Apache Shiro
 
Struts2.0basic
Struts2.0basicStruts2.0basic
Struts2.0basic
 
Implementing Authorization
Implementing AuthorizationImplementing Authorization
Implementing Authorization
 
The hidden gems of Spring Security
The hidden gems of Spring SecurityThe hidden gems of Spring Security
The hidden gems of Spring Security
 
Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
Dusan Lukic Magento 2 Integration Tests Meet Magento Serbia 2016
 

Recently uploaded

+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Recently uploaded (20)

10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 

Hacking the Grails Spring Security 2.0 Plugin