在我用javascript(Node.js)编写的DDD应用程序中,我对授权通用子域的实现感到磕磕绊绊.我查看了如何实现这一点的RBAC/ACL授权模型,但它们似乎没有我需要的每实例权限.
据我所知,RBAC具有基于角色的授权.用户被分配到角色.角色是分层的并且继承权限.角色可以拥有多个权限.权限允许在资源上执行命令.
但是,正如RBAC所定义的那样,资源是通用的,如"帖子","评论","书籍"等.它们不是特定于实例的(如Post(id:9283984)).例如,在RBAC中无法定义只有创建Post的用户才能编辑它.似乎无法将角色"Admin"分配给给定"Post(id:2398493)"上的"User(id:(8290321)"
定义具有执行修改其他人在特定资源上的角色的命令的权限的角色变得更加复杂.
我的申请要求是:
该User
谁发布的CreateLedger
命令被自动分配为Admin
这Ledger
.他只能分配给其他人作为Managers
或Collaborators
或Viewers
横木的他Admin
的.他也可以撤销这些角色.Managers
被允许来管理Accounts
的Ledger
.Collaborators
允许Transactions
对此进行编辑Ledger
,并且Viewers
只能查看数据(只读).一个Admin
可以分配Admin
角色的书,他Admin
的另一个User
.
我最初的想法是,为了使用户能够管理资源上的用户角色,需要在
user(id:X) -> role(name:Z) -> permissions -> resource(id:Y) -> commands
但在RBAC中,它只能分配
user(id:X) -> role(name:Z) -> permissions -> resource(name:"Ledger") -> commands
然后,为了克服RBAC的这种限制,我想到了用它们的id命名资源
user(id:X) -> role(name:Z) -> permissions -> resource(name:"Ledger:39823847") -> commands
但这似乎是错误的.我没有看到使用资源名称作为实际实例的映射的RBAC的任何示例.
我用错了锤子?我看错了吗?是否有其他一些更适合此任务的访问控制模型?或者这是要走的路?如果有人能指出我正确的方向,我将不胜感激.
谢谢您的帮助
我有远程JBoss 7.1服务器,我想通过使用VisualVM或JConsole连接到此服务器.
我google了一下,发现了几个关于如何使用VisualVM或JCoonsole连接JBoss 7.1的线程/教程,例如:
不幸的是,我没有通过JMX连接到我的JBoss 7.1.
您对如何使用VisualVM连接JBoss 7.1有什么想法吗?
编辑:我将-Dcom.sun.management.jmxremote.port = 1090 -Dcom.sun.management.jmxremote.authenticate = false添加到standalone.conf.bat,但我得到了一个异常:引起:java.lang.IllegalStateException: LogManager未正确安装(必须将"java.util.logging.manager"系统属性设置为"org.jboss.logmanager.LogManager").
所以,我为JAVA_OPTS添加了另一个选项:-Dcom.sun.management.jmxremote.port = 1090 -Dcom.sun.management.jmxremote.authenticate = false -Djava.util.logging.manager = org.jboss.logmanager.LogManager但是我收到的例外是:
Could not load Logmanager "org.jboss.logmanager.LogManager"
java.lang.ClassNotFoundException: org.jboss.logmanager.LogManager
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
Run Code Online (Sandbox Code Playgroud) 在REQUIRED
传播的情况下,当调用方法本身是transactionnal时,如果它们不同,当前方法是否会覆盖封闭的事务属性(例如rollbackFor)?
插图:
Class A {
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = { SomeException.class})
void foo() {
try {
b.bar();
} catch (OtherException e) {
// is the transaction marked as rollback-only at this point ?
}
}
}
Class B {
@Transactional(propagation = Propagation.REQUIRED,
rollbackFor = { OtherException.class})
void bar() {
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
好吧,我想避免琐碎的范围答案,所以我们要清楚,我知道弹簧传播处理.
如果你不是,下面是文档的相关部分,我只想澄清关于我上面例子的第一部分:
PROPAGATION_REQUIRED
当传播设置为PROPAGATION_REQUIRED时,将为应用该设置的每个方法创建逻辑事务范围.每个这样的逻辑事务范围可以单独确定仅回滚状态,外部事务范围在逻辑上独立于内部事务范围.当然,在标准PROPAGATION_REQUIRED行为的情况下,所有这些范围将映射到同一物理事务.因此,内部事务范围中的仅回滚标记集确实会影响外部事务实际提交的机会(正如您所期望的那样).
但是,在内部事务作用域设置仅回滚标记的情况下,外部事务尚未决定回滚本身,因此回滚(由内部事务作用域静默触发)是意外的.此时抛出相应的UnexpectedRollbackException.这是预期的行为,因此事务的调用者永远不会被误导,假设在实际上没有执行提交.因此,如果内部事务(外部调用者不知道)以静默方式将事务标记为仅回滚,则外部调用者仍会调用commit.外部调用者需要接收UnexpectedRollbackException以清楚地指示已执行回滚.
我的问题可以改写为:
逻辑事务范围是否包含事务属性?
我们在 jboss 7 服务器上部署了一个 spring 应用程序。
该应用程序使用通过 jndi 从 jboss 获取的多个数据源。
事务管理也由 Java EE 容器提供(我们使用 Spring JtaTransactionManager)
应用程序架构是一个传统架构,DAO 扩展了休眠模板(使用 Spring HibernateDaoSupport)。
事务在服务层使用@Transactional
注解进行管理。
我的第一个问题是:
当遇到注解时,事务管理器如何知道事务将涉及哪些数据源?
它何时有效地检索 JDBC 连接以及在哪些数据源上检索?它何时有效地开启交易?(只有 DAO 获得了对绑定到特定数据源的 sessionFactory 的引用)。
我们使用的驱动程序不支持分布式 (XA) 事务,在大多数情况下我们不需要多阶段提交,因为只写入一个数据源。无论如何,当我们访问(只读)同一事务中的其他数据源时,我们在日志中收到消息:
INFO [org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager] (http--0.0.0.0-8080-4) IJ000100: Closing a connection for you. Please close them yourself: org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@691644c: java.lang.Throwable: STACKTRACE
at org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl.registerConnection(CachedConnectionManagerImpl.java:265)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:495)
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:129)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81) [spring-orm-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
[...]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,有没有办法在不使用 XA 数据源的情况下正确管理连接释放?
否则可以安全地忽略这些消息还是它们表示真正的问题?(日志级别为 INFO)
[编辑]
关于配置的一些附加数据:
数据源声明示例
<!-- JNDI datasource -->
<bean id="customersDataSource" …
Run Code Online (Sandbox Code Playgroud) 我想针对仅使用keycloak OIDC承载当前受保护的node-js(两个应用程序都属于同一领域)对旧版Java(6)应用程序进行身份验证。
有人告诉我使用keycloak-authz-client库解析密钥库OIDC JSON,如下所示
{
"realm": "xxx",
"realm-public-key": "fnzejhbfbhafbazhfzafazbfgeuizrgyez...",
"bearer-only": true,
"auth-server-url": "http://xxx:80/auth",
"ssl-required": "external",
"resource": "resourceName"
}
但是,keycloak Java客户端需要Java 8,而我当前的运行时是jre6。重新编译包含传递依赖项的库似乎不是一个好主意,我最终使用keycloak oauth2 REST端点。
据我所知,oauth2我将使用client_credentials流在应用程序初始化时与access_token交换一次客户端机密,并在过期时进行刷新/更新。
进入keycloak文档:
访问类型
这定义了OIDC客户端的类型。
机密
机密访问类型适用于需要执行浏览器登录并在将访问代码转换为访问令牌时需要客户端密码的服务器端客户端(有关更多详细信息,请参阅OAuth 2.0规范中的“访问令牌请求”)。此类型应用于服务器端应用程序。上市
公共访问类型适用于需要执行浏览器登录的客户端。使用客户端应用程序无法保持机密安全。相反,通过为客户端配置正确的重定向URI来限制访问非常重要。仅持票人
仅承载访问类型意味着应用程序仅允许承载令牌请求。如果启用此功能,则该应用程序无法参与浏览器登录。
似乎confidential
访问类型是一种适合我的需求(应该用于服务器端应用程序),但是我不知道它与浏览器登录的关系(这与使用第三方身份提供商进行身份验证有关) facebook和co)。
该confidential
客户端设置也需要URI的浏览器有效的重定向会成功登录或lagout后重定向到。由于我要认证的客户端是一个应用程序,因此我不明白这一点。
一般来说,我不了解整个访问类型。它是否仅与客户端有关,还是与资源所有者有关(我的node.js应用程序是否仅在现有客户端使用此访问类型时才保留在承载上?它会使用通过client_credentials流获得的access_token接受承载认证吗?我猜想是将)。
有人可以弄清楚keycloak OIDC访问类型以及我做错了哪里吗?
使用keycloak将旧应用程序的访问权委派给另一个应用程序的某些资源(不限于特定用户资源)的正确方法是什么?
我在项目中使用Angular材质主题,并且可以在自定义主题之间轻松切换。
现在,我想添加一个自定义主题而不重建整个应用程序。目的是允许用户创建自己的主题并直接使用它。
角度材料可以做到吗?还是有其他方法可以做到这一点?
我正在尝试使用 ClientOAuth2.Token.refresh() 刷新 oauth2 令牌,但有时会不断收到错误消息:
{"error":"invalid_grant","error_description":"Session not active"}
这是我被 Fiddler 捕获的请求
POST [URL]= HTTP/1.1
Host: [URL]
Connection: keep-alive
Content-Length: 2250
Accept: application/json, application/x-www-form-urlencoded
Origin: http://localhost:8080
Authorization: Basic YXNpbW92LWRldi1laGlzLXdlYjo=
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
Sec-Fetch-Mode: cors
Content-Type: application/x-www-form-urlencoded
Sec-Fetch-Site: cross-site
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate, br
Accept-Language: en,vi;q=0.9,de;q=0.8,vi-VN;q=0.7,en-US;q=0.6,en-AU;q=0.5
refresh_token=[token]&grant_type=refresh_token
Run Code Online (Sandbox Code Playgroud)
也许我在 KeyCloak 帐户上的设置有问题。有什么建议吗?
我正在尝试tz
使用 jest来模拟属性和函数,但我不知道将这两个东西一起模拟:
如果运行类似:
jest.mock('moment-timezone', () => () => ({weekday: () => 5}))
jest.mock('moment-timezone', () => {
return {
tz: {
}
}
})
Run Code Online (Sandbox Code Playgroud)
我可以模拟属性tz
或指令moment()
。我怎样才能写一个模拟来覆盖这个代码?
const moment = require('moment-timezone')
module.exports.send = () => {
const now = moment()
moment.tz.setDefault('America/Sao_Paulo')
return now.weekday()
}
Run Code Online (Sandbox Code Playgroud)
谢谢
class Test4 {
public static void main(String as[]) {
System.out.println(Hello.x);
}
}
class Hello {
final static int x=10;
static {
System.out.println("Hello");
}
}
Run Code Online (Sandbox Code Playgroud)
输出: 10
为什么不Hello
按照我的知识打印如果我们调用静态变量然后加载第一个类,当加载类时,首先应该执行静态块然后发送静态变量.
我需要新的第三方jar来读取基于maven的项目中的csv.所以,我在pom.xml中输入了相同的内容.
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是当我运行mvn install或mvn package命令时,它不会下载新添加的依赖项而只是构建项目并生成war.
我想解决这个问题!如果有人面对这个问题,请分享解决方案!
问候
我已经Maven项目一个和乙。项目一采用Maven嵌入3.2.5并建立与IT项目乙。
MavenCli mavenCli = new MavenCli();
mavenCli.doMain(new String[] {"package"}, "C:\\Users\\JohnDoe\\Desktop\\abc", System.out, System.out);
Run Code Online (Sandbox Code Playgroud)
但我得到一个例外:
插件org.apache.maven.plugins:maven-compiler-plugin:3.1或其依赖项之一无法解析:无法读取org.apache.maven.plugins:maven-compiler-plugin:jar:3.1的工件描述符:无法从/到中央传输工件org.apache.maven.plugins:maven-compiler-plugin:pom:3.1(https://repo.maven.apache.org/maven2):没有可用的连接器工厂
我查看了本地存储库文件夹,确实没有插件版本3.1。如果我手动将其放置在那里,则构建成功。但是AFAIK maven会自动下载所有必需的插件。但这不会发生。