一步一步学grails:10 用户及权限

资源 下载

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    //权限值,唯一,且必须为2n次方

}

注意域类名字不能用right,因为这是sql关键字,GORM无法映射成功。

5、  运行Generate-all UserRight,生成脚手架。

6、  打开grails-app/controllers/UserRightController.groovy,在其中增加分配权限的闭包:

def editUserRight = {//编辑用户权限

     def user = LoginUser.get( params.userId )//取得指定idLoginUser实例

        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="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':''}/>

                           &nbsp;&nbsp;&nbsp;&nbsp;

                           <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)" >&nbsp;&nbsp;&nbsp;&nbsp;全选/全不选</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、               

原文地址:https://www.cnblogs.com/encounter/p/2188548.html