权限管理之添加用户同时设置角色

前情提要:

  我们在做权限管理的时候,会用到为用户分配角色。有些做法是,添加完用户再设置角色,这种就没啥了。还有的时候,我们是在添加用户的时候,就为其分配角色。现在就牵扯到一个问题,数据库中的User表的ID是UerRole表的外键,当insert的时候问题就来了。①、可以先插入用户,获得刚插入的UserID,再插入角色,这种方法觉得比较麻烦,而且问题是如果插入用户后,插入角色时失败,用户体验会不好(当然看要求了)。个人比较喜欢下面这种方法:

  使用事务的方式,这样在2个表插入的时候,有一个失败就会回滚,整个都失败。但是,这时刚插入的UserID怎么获得呢?我们知道在插入数据的时候,可以使用@@IDENTITY这个全局变量得到最新插入的主键值。因此,再插入角色时,直接在sql语句中为UserID赋值@@IDENTITY就可以了。

string sql="insert into UserRole(UserId,RoleId.....) values(@@IDENTITY,@roleid.....)"

  但是设置多个角色时,问题又来了因为@@IDENTITY获得的是最新的插入数据的主键。解决办法是:设置变量存放@@IDENTITY(set @[email protected]@IDENTITY)。

上代码:使用sql参数化,用@ReturnValue来接收@@IDENTITY,最重要的是要设置@ReturnValue参数为Output。角色表中,@UserId参数设置为ParameterDirection.InputOutput。

public int AddSetRole(User user, List<UserRole> list)
        {
            //用户表
            StringBuilder userSql = new StringBuilder();
            userSql.Append("insert into Common_Auth_User(");
            userSql.Append("LoginName,LoginPwd,FullName,Email,Phone,Enabled,PwdErrorCount,LoginCount,RegisterTime,LastLoginTime,CreateId,CreateBy,CreateTime,ModifyId,ModifyBy,ModifyTime,IsDeleted)");
            userSql.Append(" values (");
            userSql.Append("@LoginName,@LoginPwd,@FullName,@Email,@Phone,@Enabled,@PwdErrorCount,@LoginCount,@RegisterTime,@LastLoginTime,@CreateId,@CreateBy,@CreateTime,@ModifyId,@ModifyBy,@ModifyTime,@IsDeleted)");
            userSql.Append("; set @[email protected]@IDENTITY ");
            SqlParameter[] parameters = {
                    new SqlParameter("@LoginName", SqlDbType.NVarChar,50),
                    new SqlParameter("@LoginPwd", SqlDbType.NVarChar,50),
                    new SqlParameter("@FullName", SqlDbType.NVarChar,50),
                    new SqlParameter("@Email", SqlDbType.NVarChar,100),
                    new SqlParameter("@Phone", SqlDbType.NVarChar,20),
                    new SqlParameter("@Enabled", SqlDbType.Bit,1),
                    new SqlParameter("@PwdErrorCount", SqlDbType.Int,4),
                    new SqlParameter("@LoginCount", SqlDbType.Int,4),
                    new SqlParameter("@RegisterTime", SqlDbType.DateTime),
                    new SqlParameter("@LastLoginTime", SqlDbType.DateTime),
                    new SqlParameter("@CreateId", SqlDbType.Int,4),
                    new SqlParameter("@CreateBy", SqlDbType.NVarChar,50),
                    new SqlParameter("@CreateTime", SqlDbType.DateTime),
                    new SqlParameter("@ModifyId", SqlDbType.Int,4),
                    new SqlParameter("@ModifyBy", SqlDbType.NVarChar,50),
                    new SqlParameter("@ModifyTime", SqlDbType.DateTime),
                    new SqlParameter("@IsDeleted", SqlDbType.Bit,1),
                    new SqlParameter("@ReturnValue",SqlDbType.Int) };
            parameters[0].Value = user.LoginName;
            parameters[1].Value = user.LoginPwd;
            parameters[2].Value = user.FullName;
            parameters[3].Value = user.Email;
            parameters[4].Value = user.Phone;
            parameters[5].Value = user.Enabled;
            parameters[6].Value = user.PwdErrorCount;
            parameters[7].Value = user.LoginCount;
            parameters[8].Value = user.RegisterTime;
            parameters[9].Value = user.LastLoginTime;
            parameters[10].Value = user.CreateId;
            parameters[11].Value = user.CreateBy;
            parameters[12].Value = user.CreateTime;
            parameters[13].Value = user.ModifyId;
            parameters[14].Value = user.ModifyBy;
            parameters[15].Value = user.ModifyTime;
            parameters[16].Value = user.IsDeleted;
            parameters[17].Direction = ParameterDirection.Output;

            List<CommandInfo> lists = new List<CommandInfo>();
            CommandInfo commandInfo = new CommandInfo(userSql.ToString(), parameters);
            lists.Add(commandInfo);
            //用户角色表 添加

            int count = list.Count;
            for (int i = 0; i < count; i++)
            {
                StringBuilder userRoleSql = new StringBuilder();
                userRoleSql.Append("insert into Common_Auth_UserRole(");
                userRoleSql.Append("UserId,RoleId,CreateId,CreateBy,CreateTime,ModifyId,ModifyBy,ModifyTime,IsDeleted)");
                userRoleSql.Append(" values (");
                userRoleSql.Append("@UserId,@RoleId,@CreateId,@CreateBy,@CreateTime,@ModifyId,@ModifyBy,@ModifyTime,@IsDeleted)");

                SqlParameter[] userRoleParameters = {
                    new SqlParameter("@UserId", SqlDbType.Int),
                    new SqlParameter("@RoleId", SqlDbType.Int,4),
                    new SqlParameter("@CreateId", SqlDbType.Int,4),
                    new SqlParameter("@CreateBy", SqlDbType.NVarChar,50),
                    new SqlParameter("@CreateTime", SqlDbType.DateTime),
                    new SqlParameter("@ModifyId", SqlDbType.Int,4),
                    new SqlParameter("@ModifyBy", SqlDbType.NVarChar,50),
                    new SqlParameter("@ModifyTime", SqlDbType.DateTime),
                    new SqlParameter("@IsDeleted", SqlDbType.Bit,1)
                                                    };

                userRoleParameters[0].Direction=ParameterDirection.InputOutput;
                userRoleParameters[1].Value = list[i].RoleId;
                userRoleParameters[2].Value = list[i].CreateId;
                userRoleParameters[3].Value = list[i].CreateBy;
                userRoleParameters[4].Value = list[i].CreateTime;
                userRoleParameters[5].Value = list[i].ModifyId;
                userRoleParameters[6].Value = list[i].ModifyBy;
                userRoleParameters[7].Value = list[i].ModifyTime;
                userRoleParameters[8].Value = list[i].IsDeleted;

                commandInfo=new CommandInfo(userRoleSql.ToString(),userRoleParameters);
                lists.Add(commandInfo);
            }

                DbHelperSQL.ExecuteSqlTranWithIndentity(lists);
                return (int)parameters[17].Value;
        }

  SqlHelper对应代码:对应sql代码,如果参数为Output,使用变量indentity存储下来,参数为InputOutput时就把先前得到的值赋值。注意这时,ExecuteSqlTranWithIndentity方法的参数为List类型,不能使用HashTable类型(因为无序)。

 public static void ExecuteSqlTranWithIndentity(System.Collections.Generic.List<CommandInfo> SQLStringList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                using (SqlTransaction trans = conn.BeginTransaction())
                {
                    SqlCommand cmd = new SqlCommand();
                    try
                    {
                        int indentity = 0;
                        //循环
                        foreach (CommandInfo myDE in SQLStringList)
                        {
                            string cmdText = myDE.CommandText;
                            SqlParameter[] cmdParms = (SqlParameter[])myDE.Parameters;
                            foreach (SqlParameter q in cmdParms)
                            {
                                if (q.Direction == ParameterDirection.InputOutput)
                                {
                                    q.Value = indentity;
                                }
                            }
                            PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                            int val = cmd.ExecuteNonQuery();
                            foreach (SqlParameter q in cmdParms)
                            {
                                if (q.Direction == ParameterDirection.Output)
                                {
                                    indentity = Convert.ToInt32(q.Value);
                                }
                            }
                            cmd.Parameters.Clear();
                        }
                        trans.Commit();
                    }
                    catch
                    {
                        trans.Rollback();
                        throw;
                    }
                }
            }
        }
private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
                cmd.Transaction = trans;
            cmd.CommandType = CommandType.Text;//cmdType;
            if (cmdParms != null)
            {

                foreach (SqlParameter parameter in cmdParms)
                {
                    if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) &&
                        (parameter.Value == null))
                    {
                        parameter.Value = DBNull.Value;
                    }
                    cmd.Parameters.Add(parameter);
                }
            }
        }
时间: 2024-10-17 07:38:56

权限管理之添加用户同时设置角色的相关文章

(转)通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加

通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加 原文:http://www.21yunwei.com/archives/4773 有一个朋友问我如何批量创建用户和设置密码 ,我就简单给他写了两个脚本,让他自己参考下并自己根据实际情况进行修改,毕竟他需要的用户名和密码都是实际生产环境的. 这里分两种情况,一种是测试for循环批量添加用户,一个是根据实际生产环境进行批量添加.分别写一下案例如下:1,for添加指定类型用户以及设置随机密码.脚本作用:批量添加user1-10用

批量添加用户,并设置8位随机密码(禁止使用for,while等循环)

批量添加用户,并设置8位随机密码(禁止使用for,while等循环) 创建用户: [[email protected] lin]# echo oldboy{01..05}|xargs -n1 oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 [[email protected] lin]# echo oldboy{01..05}|xargs -n1|awk '{print "useradd "$NF}' useradd oldboy01 user

Centos7 添加用户及设置权限

一.添加用户 1.登录root 用户 [[email protected] /]$ su Password: # 输入密码 [[email protected] /]# 2.添加用户 [[email protected] /]# useradd testuser [[email protected] /]# 3.设置用户密码 [[email protected] /]# passwd testuser Changing password for user testuser. New passwo

FTP服务添加用户及设置权限

CentOS下安装vsftpd省略. 添加ftp账户: useradd ahaii -d /home/ftp/ -s /sbin/nologin 添加密码: passwd ahaii 限制该用户只能访问自己的家目录: vim /etc/vsftpd/vsftpd.conf#修改配置文件 chroot_list_enable=YES#打开注释 chroot_list_file=/etc/vsftpd/chroot_list#打开注释 vim chroot_list#/etc/vsftpd/目录下创

linux 添加用户并设置主目录,shell 并 并赋予权限

环境 centos 7.6 添加用户: [[email protected] ~]# useradd -d /home/yaoxu -m -s /bin/bash yaoxu 更改用户密码: passwd yaoxu 添加管理员权限: sudo adduser -g wheel username # 添加有管理员权限用户 sudo usermod -G wheel username # 追加管理员权限 查看当前组: groups 方便记录,备忘.如果对您有帮助,希望能点击推荐给予支持~ 删除用户

权限管理(一个管理员多一个角色)--初期- 待完善

对应的英文名称 检测当前登录用户是否有改权限 /// <summary> /// 判断管理员是否已经登录(解决Session超时问题) /// </summary> public bool IsAdminLogin() { //如果Session为Null if (Session["user"] != null) { return true; } else { return false; } } 判断管理员是否登录 /// <summary> ///

终端管理:限定用户给指定角色

限定用户给指定角色 随着计算机技术的进步和应用,系统管理的关注度也大幅提高.在一个中小型网络中,仅仅靠一个管理员来负责系统管理的各个方面尤为艰巨.Desktop Central 通过用户和角色管理模块,可以方便解决问题:通过明确定义的权限将例行活动指派给选定用户.通过基于角色的访问控制 (RBAC) ,将系统的访问权限仅限定给授权用户.用户定义的角色和预定义的角色 您可以在 Desktop Central 中量身定制各种角色,并基于个性化授予各种权限.然后这些角色可与 Desktop Centr

MySql 用户管理 中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束):

MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 创建用户: mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 如果报错解决方法:https://i.c

权限管理之获取用户菜单信息

exclude(p__menu__isnull=True)  非空 原文地址:https://www.cnblogs.com/jintian/p/11255281.html