我正在asp.net(C#)的网站上工作。我想授权每个登录用户(限制打开用户没有权限的任何网页)。我在Sql Server中有2个表用户和角色,我想从中获得角色&然后授权该用户。
答案 0 :(得分:1)
由于用户和角色具有多对多关系,因此用户和角色之间会有另一个联结表。假设它是 UserRoles
因此,现在在任何请求中,您将设计一个全局过滤器/处理程序,它将执行以下操作:
var user = Session["UserName"]; // getting logged in user
var role = // query that junction table **UserRoles** to get all the roles this current user has
答案 1 :(得分:0)
如果要使用存储过程验证用户访问权限,则需要以下内容:
1)用于存储用户角色的额外表格 - 让我们称之为UserXRole
2)存储过程或用户定义的函数来获取用户角色或检查用户是否具有某个角色。如下所示:
CREATE PROCEDURE dbo.UserHasRole
(
@UserId INT,
-- if you provide role name or code, an extra join with dbo.Role is required
@RoleId INT
)
AS
BEGIN
DECLARE @result BIT = (CASE
WHEN EXISTS (
SELECT 1
FROM dbo.UserXRole X
WHERE X.UserId = @UserId AND X.RoleId = @RoleId) THEN 1
ELSE 0)
RETURN @result
END
代码服从用户定义的函数限制,因此您可以将其更改为返回BIT的函数。如果您怀疑将来验证逻辑可能会变得复杂,请将其保留为存储过程。
3)使用当前记录的用户标识符
调用过程每当验证用户身份验证时,我都希望将有关已登录用户的一些信息放入Session
对象。
检查用户是否必须具有某个角色才能执行某些操作,这意味着使用当前用户标识符(例如Session["UserId"]
)和所需角色(RoleId
)调用存储过程。
上述方法应该有效,但可能导致对数据库的多次调用。更好的方法是:
1)在身份验证时缓存所有用户角色 - 当用户通过身份验证时,将他/她的所有角色存储在会话中的列表中。 E.g:
Session["CurrentUserRoles"] = rolesFromDb.Select(r => r.RoleId).ToList();
2)检查用户是否有角色仅在内存中完成。 E.g:
bool hasSomeRole = (Session["CurrentUserRoles"] as IList<int>)?.Contains(someRoleId) ?? false;
事实上,这个问题非常广泛。尝试使用其中一种建议的解决方案,并在遇到问题时回过头来提出更具针对性的问题。