在Spring Security中,我们使用intercept-url标记来定义URL的访问权限,如下所示:
<intercept-url pattern="/**" access="ROLE_ADMIN" />
<intercept-url pattern="/student" access="ROLE_STUDENT" />
Run Code Online (Sandbox Code Playgroud)
这是硬编码的applicationContext-security.xml.我想从数据库表中读取访问值.我已经定义了自己的UserDetailsService,我从数据库中读取了登录用户的角色.如何在运行时将这些角色分配给URL模式?
我知道Spring Security适用于标准角色和基于权限的授权.我不确定的是这种情况:
系统中管理着10,000名员工,员工组织成一个组织结构图(一个向各部门报告的人员树).其中一些员工是用户.这些用户仅被允许访问其职责范围内的员工(他们在树中的分支/其员工的后代).
所以我想知道现代Java EE(或其他)系统如何管理这些检查?Spring Security(ACL)可以执行此操作吗?如何对其进行建模?
我们的旧实现(多年前)是当用户访问员工时,我们可以通过递归树来检查所请求的员工是否是后代.但这不是理想的解决方案,我们希望使用新的解决方案.
我们IT团队的生产变更实施人员的任务是审查我们集团中所有各种对象的安全性,主要是为了确保离开我们的员工或已转移到其他团队的人员不再能够访问我们的服务器份额我们最近完成了SQL部分,我们有一个可重复使用的脚本,可以每年运行一次(或者我们提出的任何频率).它工作得很好,我们在10分钟左右的服务器上审核了20个数据库,只需几分钟.
现在,对于服务器的东西.我有一个使用.NET 2.0在C#中编写的应用程序,它将递归扫描目录列表并将ACL转储到文本文件中.这很好用.在本地机器上.UNC和映射路径不起作用,我收到以下异常消息:该进程不具备此操作所需的"SeSecurityPrivilege"权限.
在这一行:
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
Run Code Online (Sandbox Code Playgroud)
其中di是从DirectoryInfo []数组枚举的DirectoryInfo对象.
我们不太可能被授予SeSecurityPrivilege特权.但是我不认为这是必要的.我可以打开文件夹并右键单击属性,然后单击安全选项卡并在GUI中查看它.我也应该能够以编程方式访问它.
有关如何更改此部分代码以获取目标文件夹权限的任何想法?
private void CheckSecurity(DirectoryInfo[] DIArray)
{
foreach (DirectoryInfo di in DIArray)
{
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
string sAccessInfo = string.Empty;
foreach (FileSystemAccessRule FSAR in DirSec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
sAccessInfo += GetAceInformation(FSAR);
}
if (sAccessInfo != string.Empty)
{
// Write info to text file
}
}
}
private string GetAceInformation(FileSystemAccessRule ace)
{
StringBuilder info = new StringBuilder();
string line = string.Format("Account: {0}", ace.IdentityReference.Value);
info.AppendLine(line);
line = string.Format("Type: {0}", …Run Code Online (Sandbox Code Playgroud) 我正在努力确保为所有用户分配了特定角色.是否有任何视图或SQL查询来获取此信息?
CloudKit中有三个默认安全角色:
还有三个权限:
这些安全角色和权限如何工作?
以下是我希望通过对安全角色的解释来回答的一些问题的示例:
我有一个中等大小的MySQL数据库,带有一个主要的"人员"表,其中包含有关连接到剧院和剧院学校的每个人的基本联系信息,我负责维护和开发许多Web应用程序.
有些人只是联系人 - 也就是说,他们的"人"表记录是我们需要存储的所有信息.许多其他人必须能够为各种系统承担不同的角色.其中,大部分都是以学生身份开始的.一些人从员工开始.作为学生的人可以成为实习生或表演者; 员工可以成为学生; 所有教师都是员工和表演者等.
从本质上讲,它们是各种不同的"帽子",任何个人可能必须佩戴这些"帽子"才能访问系统的不同部分并与之交互,并且在我们网站的公共页面上提供有关它们的信息.
我实现这个模型的选择是有几个表代表这些"帽子"的表 - 包含元信息的表,以补充基本的"人"信息,所有这些都使用"人物"id作为他们的主键.例如,作为教师的人在教师表中具有包含他或她的简短传记信息和工资率的记录.所有教师也是员工(但并非所有员工都是教师),这意味着他们在员工表中有一个记录,允许他们将工作时间提交到我们的工资单系统中.
我的问题是,实施模型有什么缺点?我能想到的唯一另一个选择是为人员表填充对于大多数条目都是空的和无用的字段,然后有一个人们可以归属的"组"的繁琐表格,然后几乎每个表都有系统有一个人person_id外键然后依赖业务逻辑来验证引用的person_id属于适当的组; 但那是愚蠢的,不是吗?
下面是一些示例表声明,希望能够展示我目前如何将所有这些结合在一起,并希望说明为什么我认为这是一种更合理的方式来模拟系统必须处理的各种情况的现实.
欢迎提出任何建议和意见.我很感激你的时间.
编辑一些受访者提到使用ACL进行安全性 - 我在原始问题中没有提到我实际上使用单独的ACL包来为不同系统的实际用户进行细粒度访问控制.我的问题更多的是关于在数据库模式中存储有关人员的元数据的最佳实践.
CREATE TABLE persons (
`id` int(11) NOT NULL auto_increment,
`firstName` varchar(50) NOT NULL,
`middleName` varchar(50) NOT NULL default '',
`lastName` varchar(75) NOT NULL,
`email` varchar(100) NOT NULL default '',
`address` varchar(255) NOT NULL default '',
`address2` varchar(255) NOT NULL default '',
`city` varchar(75) NOT NULL default '',
`state` varchar(75) NOT NULL default '',
`zip` varchar(10) NOT NULL default '',
`country` …Run Code Online (Sandbox Code Playgroud) 在Spring拦截url配置中ROLE_USER和ROLE_ANONYMOUS之间有什么区别,例如下面的示例?
<http auto-config="false" access-decision-manager-ref="accessDecisionManager"
use-expressions="true">
<intercept-url pattern="/admin/**" access="hasRole('ROLE_ANONYMOUS')"
requires-channel="http" />
<intercept-url pattern="/login/**" access="hasRole('ROLE_ANONYMOUS')"
requires-channel="${application.secureChannel}" />
<intercept-url pattern="/error/**" access="hasRole('ROLE_ANONYMOUS')"
requires-channel="http" />
<intercept-url pattern="/register/**" access="hasRole('ROLE_ANONYMOUS')"
requires-channel="${application.secureChannel}" />
<intercept-url pattern="/" access="hasRole('ROLE_ANONYMOUS')"
requires-channel="http" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')"
requires-channel="http" />
<form-login login-page="/login" login-processing-url="/login/submit"
authentication-failure-url="/login/error" />
<logout logout-url="/logout" />
</http>
Run Code Online (Sandbox Code Playgroud) 对于某些现有系统,我开始使用LDAP实现授权和认证机制.在开发阶段,我面临着一个艰难的设计决策:用户角色应该存储在哪里?
如果我使用RDBMS,看起来会有三个表:user,role和user_role来映射角色和用户.
请提供可用的解决方案 我考虑将用户角色存储在LDAP中的用户角色和用户,但不确定这是否是最佳解决方案.我使用JBoss作为我的应用程序服务器.
我在Glassfish 3上运行JavaEE 6 Web应用程序.我使用JAAS和jdbcRealm以及默认主体到角色映射.在我的数据库中,我有用于将用户名映射到其角色的表:
username | role
----------+-------
john | admin
mary | user
Run Code Online (Sandbox Code Playgroud)
为什么我需要再次在我的列表中列出这些角色web.xml?
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>user</role-name>
</security-role>
Run Code Online (Sandbox Code Playgroud)
没有它isUserInRole()总是返回false.