标签: jaspic

Java EE安全性:JASPIC/JAAS还是应用安全框架?(Glassfish 3)

我目前正在使用Oracle ADF(这是一个端到端的Java EE框架)来构建我的Web应用程序和GlassFish 3.1作为应用程序服务器.

后者支持JAAS(在其管理控制台中声明).因此,我创建了一个安全领域,并使用配置文件中声明的角色映射它们,并使用JAAS实现授权和身份验证安全功能.一切都很好,直到现在!在过去的几周里,我一直在研究Java EE安全性.

我发现如果你坚持使用"基本"安全性,那么JAAS就足够了.此外,似乎JAAS(作为Java安全框架的一部分)仅适用于Java SE(但由于Java EE是基于Java SE构建的,因此其中一些模块正在被重用,例如LoginMethod和Callbacks).

然后,我发现很多关于JASPIC的帖子,发现它只能通过编程方式实现(不是问题),并且它还没有被app服务器供应商完全支持,并试图在两者之间进行比较.即使JASPIC1.1版本已经解决了一些问题,例如:

但是,容器不会完全记住身份验证.在每个请求仍然调用SAM,并且SAM仍然必须重新进行身份验证

(这对我来说听起来不太好).

然后,我继续寻找集成一些安全框架.最着名的似乎是"春天""四郎".当然,他们每个人都有自己的特点(可能第一个更适合特定情况,而第二个更适合另一个).对我来说更重要的是:

  • 认证
  • 授权
  • 会话管理(可能还有加密)

但是,到处都发现了相互矛盾的结论.结果:在搜索之前我现在更加困惑.

我只是安全等主题的新手,而且我是一名开发人员(我有实施的东西),因此很难及时了解每一个新版本,安全方面的进展似乎每天都在继续.

如果可能的话,我想根据个人经验得出一些事实.每个提示或建议都表示赞赏.我想确保在采取实施步骤之前我有信心.

java security jaas glassfish-3 jaspic

14
推荐指数
1
解决办法
2121
查看次数

简单来说,有人可以向我解释JAAS,JACC和JASPIC之间的区别吗?

我会说实话.我一直是开发人员已经有一段时间了,但这是我第一次听说JACC和JASPIC.我知道它们是授权提供商使用的标准,但它们与JAAS有何不同?我们何时会使用一个而不是另一个?

我做了一些初步的研究,并不是说我很懒.只是关于JACC和JASPIC的阅读文章有点让我不知所措,我需要在短时间内了解这一点,因为我需要在我即将开展的一个项目中实现这一点.只是在我对它的理解上寻找一个快速的开始.

jaas java-ee java-ee-6 jaspic jacc

14
推荐指数
1
解决办法
1830
查看次数

Java Web应用程序:使用自定义领域

我正在编写一个需要通过webservice登录的java Web应用程序.当然,我使用的应用程序服务器(glassfish v2)提供的领域都不能解决问题.因此,我必须自己写.但是,我写的领域实现似乎完全依赖于glassfish,不能像任何其他应用程序服务器那样使用.

是否有任何标准或广泛支持的方式来实现自定义Realm?是以任何方式从.war部署该领域,还是总是需要从服务器自己的类路径加载?

authentication jaas java-ee jaspic

13
推荐指数
2
解决办法
7775
查看次数

Java EE 7基于表单的身份验证

我目前正在开发基于Java EE 7,PostgreSQL和应用程序服务器GlassFish 4的Web应用程序.我需要实现基于表单的身份验证,并确保一些URL知道:

  • 用户和角色/组(无论它们被调用)都存储在数据库中.
  • 我希望我的应用程序尽可能"标准化"(即我目前正在使用JSF和JPA,而没有像spring,struts这样的其他框架......)

经过一番研究,我发现Java EE提供了一种称为JASPIC的标准认证机制.因此,我将研究重点放在JASPIC上,并阅读了多篇Stackoverflow Q/A和Arjan Tijms撰写的文章(如果没有他的回答或评论,几乎不可能找到与Java EE相关的Stackoverflow Q/A,多亏了他方式) :

我的问题是:JASPIC是否允许我做我需要的事情(表单身份验证+带角色的URL限制),是否值得努力使用它?我的意思是:使用其他机制可能更安全,更容易.

Arjan Tijms还说,无论是否使用JASPIC都是"鸡蛋和鸡蛋问题",如果使用JASPIC是安全的(它不会产生比它解决的更多问题),无论我需要多少代码写,我真的想成为"第一批鸡之一".

java authentication standards java-ee jaspic

8
推荐指数
1
解决办法
2369
查看次数

如何在Jetty上使用JASPI/JASPIC?

在Jetty的主项目页面上提到了与JASPI(JASPIC/JSR 196)的兼容性.

但是,Jetty 8分发似乎不包含任何与JASPI相关的类.jetty-security-8.1.8.v20121106.jar[jetty home]/lib中有一个jar,但是这个jar不包含任何JASPIC/JASPI类型.

Jetty wiki上有关JASPIC/JASPI文档只是一个占位符,不包含任何信息.

一些谷歌搜索后,我发现在Eclipse网站的JavaDoc,发现应该有一个 码头,jaspi-8.1.8.v20121106.jar 地方.这些JavaDocs也包含在发行版中.最后,一个码头jaspi回购出现在Github.

显然有一些可用的支持,但为什么这些类似乎不存在于Jetty发行版中,以及有关如何配置它的文档在哪里?我错过了什么?

java jetty java-ee jetty-8 jaspic

6
推荐指数
1
解决办法
1546
查看次数

是否可以使用密码腌制的容器管理身份验证?

我知道如何设置使用表单身份验证并使用消化密码(例如,SHA-256)的vanilla容器管理安全性.像这样的东西:

web.xml中

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>jdbc</realm-name>
    <form-login-config>
        <form-login-page>/login.jsf</form-login-page>
        <form-error-page>/login-error.jsf</form-error-page>
    </form-login-config>
</login-config>
Run Code Online (Sandbox Code Playgroud)

login.xhtml

<form action="j_security_check">
    <p><label>
        Username:<br/>
        <input type="text" name="j_username" />
    </label></p>
    <p><label>
        Password:<br/>
        <input type="password" name="j_password" />
    </label></p>
    <p>
        <button type="submit">Submit</button>
    </p>
</form>
Run Code Online (Sandbox Code Playgroud)

非常简单 - 但我真正希望能够做的是用全局盐和用户名加密密码.是的,我知道这并不理想,但现在,我只是在构建一个概念验证.

容器(GlassFish 3,在这种情况下)可以为我做这个,还是我必须编写自己的登录过滤器?我之前已经完成了(对于J2EE应用程序)但我的直觉告诉我,现在我必须采用更严格的方法来使用Java EE 6.

java jsf java-ee jsf-2 jaspic

5
推荐指数
1
解决办法
1725
查看次数

Java EE 6应用程序中的OpenID - 如何为用户获取Principal对象

我第一次在我的应用程序中玩OpenID身份验证.我可以成功地针对选择的提供程序对用户进行身份验证,但我不知道如何在Java EE服务器上正确登录用户,因此看起来用户已使用例如基于表单的登录进行登录.我可以使用Servlet 3.0 login但它需要用户名/密码对,而且在使用OpenID时我没有密码.

我希望能够得到一个Principal对象和使用isUserInRole方法等.我错过了什么吗?我在JBoss 7.1上运行这个应用程序,但我想应该有一个共同的方法来做到这一点.或者也许我错过了一些东西,Principal使用OpenID时所有的东西和用户角色都有所不同?

security servlets java-ee jaspic

5
推荐指数
1
解决办法
629
查看次数

Tomcat-Jaas - 如何检索主题?

我正在研究JAAS,我正在实现一个使用Tomcat和JaasRealm在webapp中使用的简单示例.

现在我的问题是我不知道如何检索主题,因为代码Subject subject = Subject.getSubject(AccessController.getContext());总是返回null.

我正在使用Tomcat 7.0.27.有没有我错过的东西?换句话说,如何使用JAAS管理Java EE中的授权?例如,如何在JAAS的安全上下文中实现操作?

tomcat jaas java-ee jaspic

5
推荐指数
1
解决办法
9162
查看次数

是否可以按需确定用户的组成员身份,而不是在ServerAuthModule(JASPIC)中登录时

我正在尝试编写自己的ServerAuthModule,使用自定义登录系统.

如果我理解了一切正确,那么容器会为每个传入的请求调用validateRequest方法,并且我的SAM将检查凭据,并告诉容器用户的用户名和组(如果凭据是正确的)通过的CallbackHandler.

public class MySAM implements ServerAuthModule {

    @Override
    public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {

        // check user credentials
        ...

        // set username and groups
        CallerPrincipalCallback cpCallback = new CallerPrincipalCallback(clientSubject, username);
        GroupPrincipalCallback gpCallback = new GroupPrincipalCallback(clientSubject, groups);
        callbackHandler.handle(new Callback[]{cpCallback, gpCallback}

        return AuthStatus.SUCCESS;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,当用户登录时,我不知道用户属于哪些组.我只能检查用户是否在给定的组中.是否有可能为容器提供一种方法,使用该方法可以检查用户是否在给定组中,而不是在validateRequest方法中为其提供包含组的数组?

boolean isInGroup(String username, String group) {
    // ask backend system
}
Run Code Online (Sandbox Code Playgroud)

java java-ee jaspic

5
推荐指数
1
解决办法
197
查看次数

JASPIC Wildfly 9使用会话验证请求

基于这个Jaspic示例,我为以下validateRequest方法编写了以下方法ServerAuthModule:

public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject,
        Subject serviceSubject) throws AuthException {

    boolean authenticated = false;
    final HttpServletRequest request = 
                      (HttpServletRequest) messageInfo.getRequestMessage();
    final String token = request.getParameter("token");
    TokenPrincipal principal = (TokenPrincipal) request.getUserPrincipal();

    Callback[] callbacks = new Callback[] {
            new CallerPrincipalCallback(clientSubject, (TokenPrincipal) null) };

    if (principal != null) {
        callbacks = new Callback[] { 
                new CallerPrincipalCallback(clientSubject, principal) };
        authenticated = true;
    } else {
        if (token != null && token.length() == Constants.tokenLength) {
            try { …
Run Code Online (Sandbox Code Playgroud)

java session ejb jaspic wildfly

5
推荐指数
1
解决办法
638
查看次数