我以前没有真正使用过WebSphereApplicationServer(8.5.5),也没有任何JNDI的实际经验,我甚至只与Shiro合作了几天。但我仍然需要向JNDI获取一个自定义的Shiro领域,以便应用程序和Shiro共享该领域的一个公共实例(并且该领域可以通过inject访问ejb资源)
到目前为止,我是这样做的:
WEB-INF/shiro。伊尼
[main]
realmFactory = org.apache.shiro.realm.jndi.JndiRealmFactory
realmFactory.jndiNames = realms/ShiroRealm
...
一个自定义的四郎王国(现在只是嘲笑)
import javax.faces.bean.SessionScoped;
@SessionScoped
public class MockRealm extends AuthorizingRealm implements Serializable {
@Inject public UserMB user;
@Override protected AuthenticationInfo doGetAuthenticationInfo(...) ...
@Override protected AuthorizationInfo doGetAuthorizationInfo(...) ...
}
定做的鉴定人
public class MockCredentialsMatcher implements CredentialsMatcher {
@Override public boolean doCredentialsMatch(...) ...
}
我有一个shiro创业班,如下所示
@Singleton
@Startup
public class ShiroStartup {
@Inject
private MockRealm realm;
@PostConstruct
public void setup() {
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
InitialContext ic = new InitialContext(env);
try {
Object obj = ic.lookup("realms/ShiroRealm"); // This is expected to fail when the application is published
} catch (NamingException ne) {
this.realm.setCredentialsMatcher(new MockCredentialsMatcher());
ic.rebind("realms/ShiroRealm", this.realm);
System.out.println("Bound: realms/ShiroRealm";
}
} catch (NamingException e) {
e.printStackTrace();
}
}
}
我在前面找到一篇文章,建议以这种方式桥接注入作用域,实际上这是可行的,但只有在GlassFish(v4)上运行此代码时才可行。我很确定这也适用于WAS8.5.5,但无法解决此错误。(对某人来说可能微不足道,但…)
我得到的错误是,jndi名称“realms/ShiroRealm”未找到/无法使用。(稍后我会发布确切的异常,目前在运行服务器时遇到问题)我还没有找到应该如何命名(这已经开始需要时间了,即使我希望这种信息很容易找到),所以我在这里发布,希望有人能给我提些建议。
(注意:我在这里只复制了我认为相关的部分。在GlassFish上运行调试代码时,我在所有正确的地方都得到了预期的命中率)
//更新(为了完整性,尽管我认为这些与这个问题无关)
bean的内容。xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd">
<interceptors>
<class>com.example.interceptor.ShiroSecuredInterceptor</class>
</interceptors>
</beans>
ejbjar的内容。xml
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
version="3.1">
<interceptors>
<interceptor>
<interceptor-class>com.example.interceptor.ShiroSecuredInterceptor</interceptor-class>
</interceptor>
</interceptors>
<assembly-descriptor>
<interceptor-binding>
<ejb-name>*</ejb-name>
<interceptor-class>com.example.interceptor.ShiroSecuredInterceptor</interceptor-class>
</interceptor-binding>
</assembly-descriptor>
</ejb-jar>
web.xml的常数
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID"
version="3.1">
<display-name>shiroTest</display-name>
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
<welcome-file-list>
<welcome-file>Login.xhtml</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
//UPDATE
最终使服务器重新联机,并能够引发异常
[4/17/15 12:16:22:053 EEST] 00000043 SystemErr R javax.naming.NameNotFoundException: Context: securityoffNode01Cell/nodes/securityoff/servers/server1, name: realms/ShiroRealm: First component in name realms/ShiroRealm not found. [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
如果全堆栈跟踪很重要,我把它放在pastebin上一段时间。http://pastebin.com/sANAqCJL
(意识到我用来在GlassFish上测试此配置的项目是一个简单的“war”项目,其中实际部署的实现在ear中。这些服务器之间可能相关,也可能无关。)
//阅读此内容后更新2(尚未完全更新,仍在阅读和测试):http://www-01.ibm.com/support/knowledgecenter/SS7JFU_7.0.0/com.ibm.websphere.express.iseries.doc/info/iseriesexp/ae/cejb_bindingsejbfp.html
我尝试使用一个名称:"ejblocal: MockRealm"。嗯,这似乎是可以的。然而,继续这个相同的问题,下面的异常是现在。
[4/17/15 13:17:47:536 EEST] 000000ac webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor]: java.lang.IllegalStateException: Unable to look up realm with jndi name 'ejblocal:MockRealm'.
看起来shiro.ini中使用的jndi名称仍然需要修复其他东西,但是“ejbLocal: MockRealm”或“简单的”MockRealm”是不行的。我希望尽快找到解决方案,我会发布一个真正的答案。
我偶然浏览了这个有点过时的问题。我无法配置Shiro,使其工作与是。相反,我手动将两个“范围”需要的公共数据放入JNDI上下文。这样我就可以在Shiro中查找实际应用程序中需要的东西。
有了这个解决方案,不再需要ShiroStartup了。
您是否尝试删除正在传递的“env”参数?
//InitialContext ic = new InitialContext(env); //OLD
InitialContext ic = new InitialContext(); //NEW
原因是,当Shiro尝试查找“realms/ShiroRealm”时,它将使用没有环境参数的InitialContext进行查找。
如果您定义的环境是必需的,那么您必须创建一个RealmFactory,为Shiro提供相同的属性。
package com.acme.realm.jndi;
import java.util.Properties;
import javax.naming.Context;
public class WASJndiRealmFactory extends JndiRealmFactory {
@Override
public void setJndiNames (String commaDelimited) throws IllegalStateException {
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
setJndiEnvironment(p);
super.setJndiNames(commaDelimited);
}
}
然后你必须更新你的“shiro”。ini'引用新的RealmFactory。
[main]
realmFactory = com.acme.realm.jndi.WASJndiRealmFactory
我想在我的Web应用程序中使用服务器托管连接池,现在我使用JdbcTemboard来获取连接。如何从WebSphere获取数据源并在我的应用程序中使用。
我在Azure的应用服务中使用了OpenCV,但是在安装扩展(pip安装opencv-python)时发生了错误。 似乎我可以在appservice上使用SSH登录,所以在安装模块后,使用SSH登录,然后我键入如下命令。 然后,我键入如下命令。 通过键入上述命令,我可以在Python中使用OpenCV。 我以为它会在写入requirements.txt和部署时自动安装pip,但部署或重启后操作系统
我一直在努力寻找一些资源来帮助解释我们如何使用Web应用程序服务的文件存储。 可以将其与旧的Web角色一起使用,请参阅此处(在云服务(Web和辅助角色)中使用Azure文件服务)。 但是,“Azure Web服务”中没有OnStart()方法。
我目前正在尝试学习微服务架构。我一直在尝试开发一个 Spring 启动应用程序。我刚刚在我的应用程序中实现了配置服务器。在我实现配置服务器之前,liquibase 在这些属性上工作正常。 实现后,我的服务没有找到db.changelog-master.xml文件。db.changelog目录在我的服务资源下。我应该如何更改“更改日志”属性?
问题内容: 我有一个Spring Boot REST应用程序,它依赖于Firebase中完成的身份验证。 在客户端,Firebase生成令牌,借此在Spring Boot中,我需要验证。 但是代码处于回调模式,因此如何实现该函数以使其能够完成任务? 之后如何返回?? 问题答案: 这是我自己尝试回答我自己的问题 您也可以尝试以下代码 获取更多详细信息URL https://firebase.goog
我想通过STS在Spring Boot中使用JPA和SQL Server。这是我的表: 马文 application.properties 模型.Account.class 接口账户 ServiceAccount.class 服务帐户类 我在控制器中调用了方法add帐户(),这是我得到的异常 "java.lang.NoClassDefFoundError: org/spingFramework/o