grails+spring Security项目demo

1.环境:(ubuntu13.0+jdk1.7)  grails2.3.4 + spring-security-core:2.0-RC2 + hibernate:3.6.10.6
2.步骤:

(1)新建一个目录并新建一个项目,例如

mkdir Test;
cd Test;
grails creat-app

稍后,将会需要你输入项目名称,我输入的是TestSecurity
进入项目

cd TestSecurity

(2)选择一个IDE将项目引入,我用的是intellij IDEA,将项目引入之后,我们需要将Spring Security以插件的形式引入进去,此处跟maven中引入jar包的区别不大,至于grails内部做了什么工作我们暂时不用去了解
配置项:1 ---> BulidConfig.grovvy

说明:
grails.project.war.file 此属性配置的是你将要将grails打包文件放在哪个路径,默认的是 grails.project.war.file = "target/${appName}-${appVersion}.war",此处的值可以自己设定,若使用默认值,在你使用grails war命令的时候将会在项目目录下的target目录中生成一个以项目名+version号码组成的war包

grails.project.fork 此处的配置建议全部注释掉,使用test:false,run:false,debug:true三个配置就可以了,当初这个地方的配置导致我的IDEA的debug模式无法进去,如果你也遇到无法进入debug模式,可以先检测这里的配置

dependencies配置 添加compile 'mysql:mysql-connector-java:5.1.6'(数据库连接的jar包)

plugins 配置security插件,在2.3.0以后grails 不支持在命令行引入security插件,这个地方需要注意,不要被老版本的document骗了,这里装插件的方式为在plugins配置项中添加compile ":spring-security-core:2.0-RC2"

注意:上面的操作也许会报错,说找不到插件,所以还需要在repositories配置项中指定远程插件库的地址 mavenRepo 'http://repo.spring.io/milestone'

配置项:2 ---->DataSource.grovvy

1,默认的使用的是内存数据库,就是项目运行的时候创建的一个临时的数据库,我们需要自己配置我们使用的数据库,我使用的是mysql所以有以下的配置将原来的配置覆盖掉


dataSource.driverClassName = "com.mysql.jdbc.Driver"
dataSource.dialect = org.hibernate.dialect.MySQLDialect
dataSource {
    properties {
        maxActive = 40
        maxIdle = 40
        minIdle = 20
        initialSize = 20
        minEvictableIdleTimeMillis = 60 * 1000 * 15
        timeBetweenEvictionRunsMillis = 60 * 1000 * 15
        numTestsPerEvictionRun = 3
        testOnBorrow = true
        testWhileIdle = true
        testOnReturn = false
        validationQuery = "SELECT 1"
    }
}

2,grails非常好的地方在于我们可以在一个项目里可以配置不同的环境,测试 ,生产环境只要使用不同的命令就可以将项目运行在不同的环境下

development {
        dataSource {

            dbCreate = "validate" // one of 'create', 'create-drop', 'update', 'validate', ''
            username = "root"
            password = "itlxh784533"
            url = "jdbc:mysql://localhost:3306/imdou8?useUnicode=yes&characterEncoding=UTF-8"
            logSql = true
        }
    }

配置项----->config.grovvy

前提准备:创建domain class,初学者建议使用命令s2-quickstart命令创建用户类,权限类,用户权限类

grails s2-quickstart com.yourapp Person Authority Requestmap

完成上面的准备条件后,将会看到项目的domain目录下会生成 Persion Authority PersionAuthority Requestmap四个类,Persion是我们的用户类,Authority是权限类,Requestmap是对应url访问权限类

然后我们就可以来配置config.grovvy了,既然我们用到了Security插件,所以在config.grovvy中就要对插件进行配置,如果前提准备都正常完成的话,我们可以发现config.grovvy中已经默认的生成了一些插件的配置(如果没有特殊的需求,这里就不需要更改了),例如


grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.TestSecurity.Person'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.TestSecurity.PersonAuthority'
grails.plugin.springsecurity.authority.className = 'com.TestSecurity.Authority'
grails.plugin.springsecurity.requestMap.className = 'com.TestSecurity.Requestmap'

grails.plugin.springsecurity.securityConfigType = "Requestmap" 

这些配置是告诉Security,我是用哪个类做用户类,哪个类做权限类的,这些我们都不需要更改,这里要说明的是最后一个配置


grails.plugin.springsecurity.securityConfigType = "Requestmap"

这个配置是告诉Security,用户的请求url的权限是Requestmap类来定义的,也就是用户发起一个请求,是要在数据库中检查这个表,然后根据用户的权限是否和数据库中定义的当前url访问所需要的权限相匹配来决定用户是否有权访问该资源

做完这些,Security的配置基本就完成了,但是我们知道此时,如果我们启动系统,你还没有用户帐号,而且像以前使用Security时的url权限说明和用户权限的说明都是没有数据的,所以,我们需要初始化数据,你可以在数据库中直接写入数据,或者在BootStrap.groovy中初始化系统数据

class BootStrap {

    def init = { servletContext ->
        def adminRole = new Authority(authority: 'ROLE_ADMIN').save(flush: true)
        def userRole = new Authority(authority: 'ROLE_USER').save(flush: true)
        def testUser = new Person(username: 'me', password: 'password')

        for (String url in [
                '/', '/index', '/index.gsp', 'favicon.ico',
                'js*', 'css*', 'images*',
                '/login', '/login.*', '/login',
                '/logout', '/logout.*', '/logout']) {
            new Requestmap(url: url, configAttribute: 'permitAll').save()
        }
        new Requestmap(url: '/profile*', configAttribute: 'ROLE_USER').save()
        new Requestmap(url: '/user/**', configAttribute: 'ROLE_USER').save()
        new Requestmap(url: '/secure/**', configAttribute: 'ROLE_ADMIN').save()
        new Requestmap(url: '/admin*', configAttribute: 'ROLE_ADMIN').save()
        new Requestmap(url: '/admin/role*', configAttribute: 'ROLE_SUPERVISOR').save()
        new Requestmap(url: '/admin/user*', configAttribute: 'ROLE_ADMIN,ROLE_SUPERVISOR').save()
        new Requestmap(url: '/j_spring_security_switch_user', configAttribute: 'ROLE_SWITCH_USER,isFullyAuthenticated()').save()

        testUser.save(flush: true)
        PersonAuthority.create testUser, adminRole, true
        /*PersonAuthority.create testUser, userRole, true*/
        assert Person.count() == 1
        assert Authority.count() == 2
        assert PersonAuthority.count() == 1

    }
}

这是我在grails文档上直接拷过来稍加修改的,也就是配置了我需要访问的路径的权限,系统在启动的时候会将本地数据库中插入这些数据

启动项目,访问设置权限的资源,例如我在上面的初始化设置的用户是'me' 此用户有'ROLE_ADMIN'权限,而我的SecureController的访问权限是需要有‘ROLE_ADMIN’权限的,所以访问SecureController的时候,会跳转到登录页面,登录成功后就会访问到我们期待的资源.

ps:url访问权限是可以配置在config.grovvy中的,只要设置


grails.plugin.springsecurity.securityConfigType = "InterceptUrlMap"

并且设置


grails.plugin.springsecurity.interceptUrlMap = [
                '*':                  ['permitAll'],
                '/index':             ['permitAll'],
                '/index.gsp':         ['permitAll'],
                'js*':                ['permitAll'],
                'css*':               ['permitAll'],
                'images*':            ['permitAll'],
                'favicon.ico':        ['permitAll'],
                '*login*':            ['permitAll'],
                '/login/auth':        ['permitAll'],
                '/login*':            ['permitAll'],
                '/logout*':           ['permitAll'],
                '/secure*':           ["hasRole('ROLE_USER')"],
                '/user*//**':           ["hasRole('ROLE_USER')"],
                '/secure*//**':         ["hasRole('ROLE_ADMIN')"],
            ]


这样项目初步就可以跑起来了,下面介绍一下MD5加密

grails推荐的加密方式是'bcrypt' 但是我们可以设置密码MD5加密,步骤如下

1,在config.grovvy中添加如下配置

grails.plugin.springsecurity.password.algorithm = 'MD5'
grails.plugin.springsecurity.dao.reflectionSaltSourceProperty = 'username'

algorithm是说明加密方式,我们设定为md5加密

reflectionSaltSourceProperty是说明盐值的,我们设定是用户名,及username

2,更改Persion.grovvy中的encodePassword方法

protected void encodePassword() {
		password = springSecurityService.encodePassword(password,username)
	}

重新启动项目,进数据库查看密码格式会发现密码变为MD5加密了

注意:更换项目密码为MD5加密方式的时候最好先将数据库中的表清空,否则可能会发生用户授权表没有数据...

ps : 有什么问题欢迎留言共同探讨

项目war包grails_spring_security

你可能感兴趣的:(spring,Security,grails)