一步一步学grails:10 用户及权限
2010-01-28 16:28 乱世文章 阅读(592) 评论(0) 编辑 收藏 举报资源 下载
1、 打开grails-app/views/layouts/main.gsp,在主菜单上增加一个“用户管理”菜单:
<g:link class="human" action="index" controller="loginUser">用户管理</g:link>
2、 修改grails-app/views/loginUser/list.gsp,增加两个列:
分配权限链接:
<g:link controller="userRight" action="editUserRight" params="['userId':loginUserInstance?.userId]">分配权限</g:link>
删除按钮:
<g:form controller="loginUser" action="delete">
<input type="hidden" name="id" value="${loginUserInstance?.id}" />
<span class="button"><g:submitButton name="delete" class="delete" value="删除"/></span>
</g:form>
3、 修改新增用户页面grails-app/views/loginUser/add.gsp:
把权限字段level从页面中去除。注意,同时需要修改LoginUser.groovy,把level的约束修改为:
level() //用户级别
4、 新建一个域UserRight:
class UserRight {//域类:权限类
static constraints = {
rightName(nullable:false)
rightValue(min:0,unique:true)//权限值必须唯一
}
String rightName //权限名,仅用于描述
int rightValue //权限值,唯一,且必须为2的n次方
}
注意域类名字不能用right,因为这是sql关键字,GORM无法映射成功。
5、 运行Generate-all UserRight,生成脚手架。
6、 打开grails-app/controllers/UserRightController.groovy,在其中增加分配权限的闭包:
def editUserRight = {//编辑用户权限
def user = LoginUser.get( params.userId )//取得指定id的LoginUser实例
if(!user) {//若实例为空
flash.message = "/u7528/u6237id:${params.userId}/u4E0D/u5B58/u5728/uFF01 "
redirect(action:'list',controller:'loginUser')//转向用户管理页面
}
else {
return [ user : user ]//否则转向editUserRight.gsp
}
}
7、 新建grails-app/veiws/userRight/editUserRight.gsp:
……
<script language="javascript">
/*全选/全不选checkbox实现*/
function checkall(obj,options){
//obj.checked=!obj.checked;
var o=options;
for (i = 0; i < o.length; i++) {
o[i].checked = obj.checked;
}
}
</script>
……
<span style="color:#ff0066">[用户]:</span><g:link action="show" controller="loginUser" id="${user.id}">${user.userId}</g:link>
<g:if test="${flash.message}">
<div class="message" align="left">${flash.message}</div>
</g:if>
<div class="list">
<g:form method="post">
<input type="hidden" name="userId" value="${user.id}" />
<table style="width:400" align="center">
<tbody>
<g:each in="${UserRight.list()}" status="i" var="right">
<tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
<td ><!—实现权限列表的选择-->
<input type="checkbox" name="rightValues" value="${right.rightValue}" ${(user.level&right.rightValue)!=0?'checked':''}/>
<g:link action="show" id="${right.id}">${right.rightName}</g:link></td>
</tr>
</g:each>
<tr><td>
<input type="checkbox" name="all" onclick="checkall(this,rightValues)" > 全选/全不选</input>
</td></tr>
</tbody>
</table>
<div class="buttons">
<span class="button">
<g:actionSubmit class="save" value="修改" action="updateUserRight" /></span>
</div>
</g:form>
……
最终呈现如下效果:
8、 editUserRight.gsp页面将调用updateUserRight这个action来进行用户权限的修改:
def updateUserRight = { //保存对用户权限的编辑
def user = LoginUser.get( params.userId )
def rightValues=params.rightValues //取得checkbox数组值
int level=0;
rightValues.each{level+=it.toInteger()}//把选中的各权限值累加到level
if(user&&level!=user.level) { //若用户存在
user.level=level //若权限值发生改变,重设权限值
user.save() //更新数据库
flash.message="/u7528/u6237/u6743/u9650/u4FEE/u6539/u6210/u529F/uFF01" //中文:用户权限修改成功
}
else {
flash.message="/u7528/u6237/u6743/u9650/u672A/u4FEE/u6539/uFF01" //中文:用户权限未修改
}
redirect(action:'editUserRight',params:['userId':params.userId])
}
9、 我们需要为用户设计一个修改登录密码的功能:
当用户输入旧密码和新密码之后点击修改,后台action 会验证用户输入的旧密码是否正确,验证通过的话,将用户的密码修改为新密码:
10、 首先,我们需要在菜单栏中加入一个“修改密码”按钮,在main.gsp页面中加入以下内容:
<g:if test="${session.level!=null&&(session.level&8)!=0}">
<span class="menuButton"><g:link class="human" action="index" controller="loginUser">用户管理</g:link></span>
</g:if><g:else>
<span class="menuButton"><g:link class="human" action="modifyPWD" controller="loginUser">修改密码</g:link></span>
</g:else>
这里用了一个<g:if>和<g:else>标签,对用户登录的权限进行验证,如果用户权限中包含有“用户管理”权限(权限值为8的,见数据库),则显示 “用户管理”菜单,否则显示 “修改密码”菜单:
这是由于用户管理中已经包含了“修改用户资料”功能(修改密码也包括在其中)。
通过这种方式,我们根据用户权限对用户有权访问的功能进行限制。
11、 从上面就可以看出,我们需要为loginUser控制器设计一个叫做“modifyPWD”的action:
def modifyPWD = {
def userId=session.userId
if(!userId) {//若未登录
//中文:您尚未登录,请先登录!
flash.message = "/u60A8/u5C1A/u672A/u767B/u5F55/uFF0C/u8BF7/u5148/u767B/u5F55/uFF01"
redirect(action:login)
} else if(request.method=='GET'){
def user=LoginUser.findByUserId(userId)
return [ loginUserInstance : user]//仍返回modifyPWD.gsp页面
}else {
def pwd=params.password//取得旧密码
def pwd1=params.password1//取得新密码
def user=LoginUser.findByUserIdAndPassword(userId,pwd)//验证用户名密码
if(user){//若验证通过
if(!pwd.equals(pwd1)){ //并且新密码确实与旧密码不一样
user.password=pwd1//把用户的密码改为新密码
if(user.save()){//保存修改到数据库
//中文:密码修改成功
flash.message="/u5BC6/u7801/u4FEE/u6539/u6210/u529F/uFF01"
//user.refresh()
return [ loginUserInstance : user]//仍返回modifyPWD.gsp页面
}
}
}else{//若旧密码验证不通过
flash.message="/u5BC6/u7801/u9519/u8BEF/uFF01"//中文:密码错误!
user=LoginUser.findByUserId(userId)//根据用户名取得LoginUser实例
return [ loginUserInstance : user]//仍返回modifyPWD.gsp页面
}
}
}
12、 从上面看出,我们还需要为action loginUser设计一个modifyPWD.gsp页面:
……
<label for="userId">帐号:</label>
……
${session?.userId}
……
<label >请输入旧密码:</label>
……
<input type="text" id="password" name="password" value=""/>
……
<label for="password">请输入新密码:</label>
……
<input type="text" id="password1" name="password1" value=""/>
</td>
……
……
<g:hiddenField name="flag" value="1" />
<g:actionSubmit class="save" value="修改" action="modifyPWD"/></span>
……
这样修改密码功能就完成了。
13、