SpringOne 2GX Sample Apps - Spring Security Basic Auth Login

Posted by: Burt Beckwith on 2009-12-01 18:17:00.0

This is the third in a series of posts making the demo applications that I used for my SpringOne 2GX presentations available. I'll describe here how to create a Grails application using the Spring Security plugin that authenticates users with HTTP Basic Auth. This was used in the Demystifying Spring Security in Grails talk (you can download the presentation here).

Also refer to the plugin documentation for other tutorials here.


To create an application that authenticates users using HTTP Basic Auth, run

grails create-app springone2gx_basic
cd springone2gx_basic

To make classpath management simpler in Eclipse/STS I create a grails-app/conf/BuildConfig.groovy (in Grails 1.1 apps; in 1.2 this is done for you) with the line

grails.project.plugins.dir='plugins'

to keep plugins in the project root like in 1.0.x but this is optional.

Next install the plugin:

grails install-plugin acegi

Run the create-auth-domains script to generate the person, authority, and request map domain classes and also grails-app/conf/SecurityConfig.groovy:

grails create-auth-domains com.burtbeckwith.springone2gx.User com.burtbeckwith.springone2gx.Role com.burtbeckwith.springone2gx.Requestmap

The other two scripts that the plugin provides are optional and create CRUD pages (generate-manager) and basic user registration (generate-registration). It's a good idea to run generate-manager; run generate-registration if it's useful to you.

grails generate-manager

Unlike the previous two posts, we'll use database Requestmap entries to secure the application in grails-app/conf/SecurityConfig.groovy:

security {

   active = true

   loginUserDomainClass = 'com.burtbeckwith.springone2gx.User'
   authorityDomainClass = 'com.burtbeckwith.springone2gx.Role'
   requestMapClass = 'com.burtbeckwith.springone2gx.Requestmap'
}

In Eclipse or STS the steps to configure the classpath are:

  • add PLUGIN_DIR/src/groovy as a source folder
  • add PLUGIN_DIR/src/java as a source folder
  • add PLUGIN_DIR/grails-app/services as a source folder
  • add these jars from PLUGIN_DIR/lib
    • facebook-java-api-2.0.4.jar
    • jcifs-1.2.25.jar
    • spring-ldap-1.2.1.jar
    • spring-ldap-tiger-1.2.1.jar
    • spring-security-core-2.0.4.jar
    • spring-security-core-tiger-2.0.4.jar
    • spring-security-ntlm-2.0.4.jar
    • spring-security-openid-2.0.4.jar

Having done all that, let's create a secured controller:

grails create-controller secure

but we omit annotations since we're using Requestmaps:

class SecureController {

   def index = {
      render 'Secure access only'
   }
}

Let's create a user and a request map entry in BootStrap:

import com.burtbeckwith.springone2gx.Requestmap
import com.burtbeckwith.springone2gx.Role
import com.burtbeckwith.springone2gx.User

class BootStrap {

   def passwordEncoder

   def init = { servletContext ->

      def adminRole = new Role(description: 'Admin', authority: 'ROLE_ADMIN').save()
      String password = passwordEncoder.encodePassword('p4ssw0rd', null)
      def user = new User(username: 'admin', userRealName: 'me', passwd: password,
            enabled: true, email: '[email protected]').save()
      adminRole.addToPeople user

      new Requestmap(url: '/secure/**',
                     configAttribute: 'ROLE_ADMIN').save(flush: true)
   }

   def destroy = {}
}

Next lets configure Basic auth. We enable Basic auth using the basicProcessingFilter attribute and need to set a realm name:

security {

   active = true

   loginUserDomainClass = 'User'
   authorityDomainClass = 'Role'
   requestMapClass = 'Requestmap'
   
   basicProcessingFilter = true
   realmName = 'springone2gx'
}

There's a small bug in the plugin (which will be fixed in the next release) that requires a tweak in grails-app/conf/spring/resources.groovy:

import org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint

beans = {
   
   authenticationEntryPoint(BasicProcessingFilterEntryPoint) {
      realmName = 'springone2gx'
   }
}

The realm name has to match the value specified in SecurityConfig.groovy.

Start the app using

grails run-app

and open http://localhost:8080/springone2gx_basic/secure/ in a browser and it should prompt you to login with a familiar browser popup - use the username and password from the user created in BootStrap to login.


You can download a finished application based on this discussion here


be the first to rate this blog

About Burt Beckwith

Burt Beckwith

Burt Beckwith is a Java developer with over ten years of experience in a variety of industries including biotech, travel, e-learning, social networking, and financial services. For the past two years he's been working with Grails and Groovy full-time. Along the way he's released five Grails plugins and is the primary developer of the Spring Security plugin. He was the technical editor for Grails in Action.

More About Burt »

NFJS, the Magazine

2009-11-01 00:00:00.0 Issue Now Available
  • Git Going with Distributed Version Control
    by Matthew McCullough
  • Coding Functional Style
    by Venkat Subramaniam
  • Hibernate Performance Tuning, Part 1
    by Scott Leberknight
  • SPARQL: Querying the Data Web
    by Brian Sletten
Learn More »