zoukankan      html  css  js  c++  java
  • 一步一步学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、               

  • 相关阅读:
    springmvc log4j 配置
    intellij idea maven springmvc 环境搭建
    spring,property not found on type
    intellij idea maven 工程生成可执行的jar
    device eth0 does not seem to be present, delaying initialization
    macos ssh host配置及免密登陆
    centos7 搭建 docker 环境
    通过rest接口获取自增id (twitter snowflake算法)
    微信小程序开发体验
    gitbook 制作 beego 参考手册
  • 原文地址:https://www.cnblogs.com/encounter/p/2188548.html
Copyright © 2011-2022 走看看