【问题标题】:Assigning Roles to Users为用户分配角色
【发布时间】:2010-10-09 04:28:50
【问题描述】:

我无法弄清楚如何为用户分配角色。我已经让登录机制正常工作,但需要弄清楚如何使用定义的角色来授予用户一定的访问权限。

我有一个包含这些表的数据库:

表 ------ UserTbl RolesTbl UserInRoleTbl -------- ---------- ------------- 用户 ID (PK) RoleId (PK) ID (PK) 名称 RoleName UserId 用户名 描述 RoleId 密码 电子邮件

使用这个小型数据库,我正在测试为用户分配角色的能力。

我使用LINQtoSQL 作为数据访问层。我已经创建了登录机制来登录软件,然后我就卡在下一步该做什么了。

例如:

username = admin,password= admin, RoleId = 1 ;Rolename =Administrator;

然后我在登录后使用以下代码获取角色:n

public partial class Window3 : Window
{  

    public Window3()
    {
        InitializeComponent();

        GenericIdentity My2 = new GenericIdentity("admin");

        string[] roles1 = { "Administrator" };

        GenericPrincipal principal1 = new GenericPrincipal(My2, roles1);
        Thread.CurrentPrincipal = principal1;
     }

private void LoadWindow(object sender, RoutedEventArgs e)
    {   if (Thread.CurrentPrincipal.IsInRole("Administrator"))
        {
             exercise.Visibility = Visibility;
              tot.IsEnabled = false;
        }

}

我实现了代码角色但是没有与数据库的连接;相反,我想从数据库中存储角色,在 C# 中创建一个方法并写下用户登录后访问应用程序的代码。

进一步解释:我给了Rolename = Administrator,所以如果用户是管理员,他将获得这个角色,但我不确定如何从数据库中检索这些信息并将其与用户联系起来。谁能帮帮我?

同一用户提出的相关(或可能重复)问题:

Username and role
Forms Authenticate
How create role to put in the database?

【问题讨论】:

    标签: c# .net wpf database linq-to-sql


    【解决方案1】:

    抱歉,我觉得你的问题有点混乱。

    您似乎希望有两个表,User 和 Role,中间有一个多对多连接表 UserRole。 User 和 Role 都必须有主键,主键都出现在连接表中。

    create table user
    (
        user_id int not null, 
        -- other fields here, like username, password, etc.
        primary key(user_id)
    );
    
    create table role
    (
        role_id int not null,
        -- other fields here, like role name, etc.
        primary key(role_id)
    );
    
    create table user_role
    (
        user_id int not null,
        role_id int not null,
        primary key(user_id, role_id),
        foreign key(user_id) references(user),
        foreign key(role_id) references(role)
    );
    

    当您查询用户以查看他们是否已获得授权时,您将加入多对多表以同时恢复所有潜在角色。如果您提供的凭据包含角色,则您的授权代码应检查以确保它当时是潜在角色集的成员。

    一点建议:不要在表名中使用“Tbl”。在我看来,它们是多余的。

    【讨论】:

    • 非常感谢 Gortok 对我的帮助,并对我的困惑感到抱歉。 Duffymo 我按照你的建议重写了数据库。那么你能写一个代码示例如何在凭证中包含角色吗?真诚地,我不知道在该用户身份验证后如何写下代码并通过查询将角色设置为用户。
    • 对不起,我没有代码。我是 Java 人,而不是 C#。其他人将不得不帮助您。
    【解决方案2】:

    如果您的数据库中有“UserTbl”和“RolesTbl”,那么您的 LINQ-to-SQL 模型中还应该有两个名为“UserTbl”和“RolesTbl”的类。

    要将角色存储在数据库中,请实例化其中一个“RolesTbl”对象,设置其属性,然后将其添加到 LINQ 数据上下文中。与“UserTbl”对象相同。

    编辑:这是请求的代码示例 - 假设您已经设置了数据库、LINQ-to-SQL 模型并使用了所有默认名称:

    // create the LINQ-to-SQL Data context
    UsersAndRolesDataContext dc = new UsersAndRolesDataContext();
    
    // create new instace of "UserTbl" object
    UserTbl newUser = new UserTbl();
    newUser.UserID = "newuser";
    newUser.Name = "Some NewUser";
    newUser.EMail = "newuser@somewhere.org";
    newUser.Password = "TopSecret";
    
    // add new user to the table of users in the data context
    dc.UserTbls.InsertOnSubmit(newUser);
    
    // create new instance of a role
    RolesTbl newRole = new RolesTbl();
    newRole.RoleId = "ADMIN";
    newRole.RoleName = "Administrators";
    newRole.Description = "User with administrative rights";
    
    // add new role into LINQ-to-SQL Data context
    dc.RolesTbls.InsertOnSubmit(newRole);
    
    // write out all changes back to database
    dc.SubmitChanges();
    

    这有帮助吗?

    马克

    【讨论】:

    • 嗨,Marc,您能发布一个示例(代码 sn-p 跟随我的数据库)如何使它正确?真诚地,我一直坚持前进:(。
    • 谢谢 Marc,这不是我发现的,但经过数小时的工作,我找到了解决方案……不过,我很高兴得到您的支持,并为我的英语不好表示歉意.有快乐的一天。再见
    猜你喜欢
    • 2020-10-16
    • 2016-03-09
    • 2018-08-21
    • 2019-06-04
    • 2017-11-23
    • 2021-06-29
    • 2019-05-10
    • 2014-04-07
    • 2018-12-31
    相关资源
    最近更新 更多