(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"
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'
reflectionSaltSourceProperty是说明盐值的,我们设定是用户名,及username
2,更改Persion.grovvy中的encodePassword方法
protected void encodePassword() { password = springSecurityService.encodePassword(password,username) }
注意:更换项目密码为MD5加密方式的时候最好先将数据库中的表清空,否则可能会发生用户授权表没有数据...
ps : 有什么问题欢迎留言共同探讨
项目war包grails_spring_security