• 一步一步学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、               

  • 相关阅读:
    企业如何搭建数据分析平台
    如何查看Android设备上的分区信息
    从传统企业谈大数据的战略意义
    金融行业的BI应用分析
    Android 5.x 权限问题解决方法
    unity使用ugui自制调色面板
    手机模式及分区
    高通8x12平台开机画面制作工具
    Unity插件
    Android开发小问题集
  • 原文地址:https://www.cnblogs.com/encounter/p/2188548.html
Copyright © 2020-2023  润新知