在本文中,我将继续构建一个“微型博客” Blogito。我删除了此前文章(“用定制 URI 和 codec 优化 Grails 中的 URI”)中的 User,因为 name 字段是 URI 的重要组成部分。这一次我们将实现完整 的 User 子系统。您将理解到如何根据 User 是否登录启用登录、限制用户行为,甚至根据 User 的角色 添加一些授权。
首先,User 需要一种登录方式,从而能够发布新的条目。
身份验证
对于支持多个用户的博客服务器来说,进行身份验证是个好主意。您肯定不希望 John Doe 以 Jane Smith 的身份发布博客条目,不管是有意还是无意。设置身份验证基础设施将回答这个问题:“您是谁? ”,稍后,您还将添加一些授权机制。授权将回答关于 “允许您做什么” 的问题。
清单 1 展示了您在 在上一篇文章 中创建的 grails-app/domain/User.groovy 文件:
清单 1. User 类
class User {
static constraints = {
login(unique:true)
password(password:true)
name()
}
static hasMany = [entries:Entry]
String login
String password
String name
String toString(){
name
}
}
login 和 password 字段已经就绪。您现在只需要提供一个控制器和一个表单。创建 grails- app/controllers/UserController.groovy 并添加如清单 2 所示的代码:
清单 2. 将 login、authenticate 和 logout 闭包添加到 UserController
class UserController {
def scaffold = User
def login = {}
def authenticate = {
def user = User.findByLoginAndPassword(params.login, params.password)
if(user){
session.user = user
flash.message = "Hello ${user.name}!"
redirect(controller:"entry", action:"list")
}else{
flash.message = "Sorry, ${params.login}. Please try again."
redirect(action:"login")
}
}
def logout = {
flash.message = "Goodbye ${session.user.name}"
session.user = null
redirect(controller:"entry", action:"list")
}
}