12

我正在尝试在我的 WAR 中使用 JAAS 进行身份验证。我知道我的配置文件另一个链接)应该放在某个地方(如此所述)。不幸的是,如果我们在谈论 WAR,我无法理解确切的位置?以及如何命名文件?

// JAAS has to find the file and retrieve "foo" from it
LoginContext ctx = new LoginContext("foo", this);
4

3 回答 3

8

我有同样的问题,我想看看我是否不能根据当前的类路径(它将位于战争本身)动态设置这个属性。

public class SecurityListener implements ServletContextListener {
    public SecurityListener() {
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        if(System.getProperty("java.security.auth.login.config") == null) {
            String jaasConfigFile = null;
            URL jaasConfigURL = this.getClass().getClassLoader().getResource("login.conf");
            if(jaasConfigURL != null) {
                jaasConfigFile = jaasConfigURL.getFile();
            }
            System.setProperty("java.security.auth.login.config", jaasConfigFile);
        }
    }
}

显然,您需要将侦听器添加到您的 web.xml:

<listener>
    <listener-class>example.SecurityListener</listener-class>
</listener>

这样做是在 Web 应用程序实例化时设置属性java.security.auth.login.config(如果尚未定义)。这意味着如果没有在其他地方重新定义,您可以将其放入源文件夹并自动加载它。我已经对此进行了测试,它适用于 Tomcat 6。

因此,例如,如果您的 tomcat 安装在“C:\program files\tomcat6\”中,而您的 war 部署在“C:\program files\tomcat6\webapps\mywar”中,它将找到的路径将是“C:\ program files\tomcat6\webapp\mywar\WEB-INF\classes”,这总是准确的。不确定此解决方案是否也适用于其他 Web 应用程序,但我想是这样,因为 login.conf 将成为类路径根目录的位置。

希望有帮助!

于 2012-07-19T09:37:53.537 回答
8

可以将client_jaas.conf封装在jar中,使用代码动态指定配置

System.setProperty("java.security.auth.login.config", XXX.class.getClassLoader().getResource("client_jaas.conf").toString());
于 2016-10-14T07:44:52.617 回答
3

不幸的是,我能够让它工作的唯一方法是创建一个文件jass.conf并使用以下任一方法指定它:

  • 在 Tomcat 的 java 参数中:

    -Djava.security.auth.login.config==c:\\path\\To\\file.conf
    
  • 或从 Java 代码中:

    System.setProperty("java.security.auth.login.config","c:\\path\\To\\file.conf");
    

我还想知道指定配置的更好方法。我想将该配置打包到我的 WAR 中。

于 2011-03-03T15:20:17.587 回答