Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。
现在尝试用它来写一个服务端的程序。
创建基本程序的步骤,网上到处都有,这里就省略了。
为了实现用户验证需要以下几个步骤:
1.安装插件,2.执行插件附带的脚本文件,生成关键域类。3.手动修改一些配置参数。4.设置演示用的数据,然后测试。
1.安装插件
插件安装需要编辑build.gradle文件。本例采用最简单的方式,只需要安装核心以及rest插件。
compile'org.grails.plugins:spring-security-core:3.2.0'
compile'org.grails.plugins:spring-security-rest:2.0.0.M2'
插件的版本是有关系的,不同的版本可能导致所需配置的参数不同,甚至是无法启动。
2.执行脚本
按ctrl+alt+g,打开脚本执行窗口。
![](https://img.haomeiwen.com/i10704507/774c0f298c402cac.png)
执行s2-quickstart cn.edu.cup.system User Role
第一个参数是包名,第二个是用户,第三是权限。
脚本执行后,会生成User, Role, UserRole三个域类。另外,还会增加一个监听器userPasswordEncoderListener在resources.groovy中。
第三,会生成application.groovy文件在conf目录下。一般情况下(本例),这个文件不需要编辑。
3. 手动修改一些配置参数
参考网上的例子(http://learnwebtechs.com/2017/02/14/grails-3-with-mongodb-and-spring-security-core-step-by-step)
需要编辑application.yml, 增加以下内容:
![](https://img.haomeiwen.com/i10704507/adf7be6386080b07.png)
图中所选择的部分(尝试贴源代码失败,所以先贴个图)。
<code>
# 20200213
plugin:
springsecurity:
controllerAnnotations:
chainMap:
'/api/**':'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter'
'/**':'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'
rest:
logout:
endpointUrl:'/api/logout'
token:
validation:
useBearerToken: false
headerName:'X-Auth-Token'
</code>
4.最后设置演示数据
演示数据包括一个测试域类cn.edu.cup.demo.TestA
<code>
@GrailsCompileStatic
@EqualsAndHashCode(includes='name')
@ToString(includes='name', includeNames=true, includePackage=false)
class TestA {
Stringname
static constraints ={
}
}
</code>
这个域类的控制器上增加注释:@Secured('ROLE_ADMIN')
用户以及权限的生成代码如下:
首先是创建一个服务,用于生成数据。然后在BootStrap中调用。
<code>
def setupSampleData() {
createSampleDemoData()
createDefaultRoles()
createDefaultUsers()
}
private void createSampleDemoData() {
for (int i =0; i <20; i++) {
def t =new TestA(name:"张${i}李${i +1}")
t.save()
}
}
private void createDefaultRoles() {
if (!Role.findByAuthority('ROLE_ADMIN')) {
new Role(authority:'ROLE_ADMIN').save(flush:true)
}
}
private void createDefaultUsers() {
if (!User.findByUsername('admin')) {
def admin =new User(username:'admin',password:'123456')
admin.save(flush:true)
UserRole.create(admin, Role.findByAuthority('ROLE_ADMIN'),true);
}
}
</code>
5.测试
程序后的界面如下:
![](https://img.haomeiwen.com/i10704507/1014dab1a2abce06.png)
点击测试链接,就会弹出登录对话框:
![](https://img.haomeiwen.com/i10704507/47a34e23a483b25a.png)
登陆后,会返回测试数据:
![](https://img.haomeiwen.com/i10704507/8bda6dd789bdcc9e.png)
另外,还采用VUE写了一个客户端:
![](https://img.haomeiwen.com/i10704507/3692bb47c8c1f9f4.png)
以上是客户端的界面,右侧打开的是调试内容。点击登录:
![](https://img.haomeiwen.com/i10704507/9df2493e1c28a083.png)
登陆后,能够生成相应的令牌。参见截图:
![](https://img.haomeiwen.com/i10704507/f0b58b0d30ab4531.png)
点击测试,也能返回演示数据。
6.遇到的见鬼的问题
这个服务器看似没有问题,但是,运行时间长了,就不对了。——————
无论是web界面,还是客户端,登陆的时候都会:报告这个错误:No operations allowed after connection closed.
按错误判断,应该是数据库连接丢失。但是,一直不知道该如何排查这个错误!
希望网上的大侠指点一二!
网友评论