Grails Spring security rest 实践与困
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,打开脚本执行窗口。
执行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, 增加以下内容:
图中所选择的部分(尝试贴源代码失败,所以先贴个图)。
<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.测试
程序后的界面如下:
点击测试链接,就会弹出登录对话框:
登陆后,会返回测试数据:
另外,还采用VUE写了一个客户端:
以上是客户端的界面,右侧打开的是调试内容。点击登录:
登陆后,能够生成相应的令牌。参见截图:
点击测试,也能返回演示数据。
6.遇到的见鬼的问题
这个服务器看似没有问题,但是,运行时间长了,就不对了。——————
无论是web界面,还是客户端,登陆的时候都会:报告这个错误:No operations allowed after connection closed.
按错误判断,应该是数据库连接丢失。但是,一直不知道该如何排查这个错误!
希望网上的大侠指点一二!