我想知道当前的方法是关于使用JSF 2.0(如果存在任何组件)和Java EE 6核心机制(登录/检查权限/注销)的Web应用程序的用户身份验证,其中包含用户信息保存在JPA中实体.Oracle Java EE教程在这方面有点稀疏(仅处理servlet).
这没有使用整个其他框架,如Spring-Security(acegi)或Seam,但如果可能的话,试图用新的Java EE 6平台(Web配置文件).
我很难理解JAAS.这一切似乎都应该比它应该更复杂(尤其是Sun教程).我需要一个简单的教程或示例,介绍如何在基于Struts + Spring + Hibernate和自定义用户存储库的Java应用程序中实现安全性(身份验证+授权).可以使用ACEGI实现.
我正在开发一个需要基于对象的身份验证和授权的服务器端应用程序.我喜欢Shiro的简单性,但为了与JAAS兼容,我编写了一个使用Apache Shiro作为底层机制的LoginModule.
但我的问题是我找不到将JAAS授权检查委托给Shiro的方法.我怎样才能做到这一点?
我正在使用mockito来测试遗留的JAAS/LDAP登录模块.
该javax.security.auth.callback.CallbackHandler
接口定义了功能:
void handle(javax.security.auth.callback.Callback[] callbacks)
Run Code Online (Sandbox Code Playgroud)
我期待callbacks
包含一个NameCallback
,这是需要操纵以通过测试的对象.
有没有办法有效地模拟这个,或者我会更好地使用存根实现CallbackHandler
?
我正在使用JConsole访问正在运行的MBean.
MBean使用自定义Jaas登录模块,并使用以下命令运行:
java -classpath UserLGUGroupHandlingApplication.jar;MBeanSecure.jar
-com.sun.management.jmxremote.login.config=management.properties
-Djava.security.auth.login.config=./sample_jaas.config
com.test.running.RunningImplementation
Run Code Online (Sandbox Code Playgroud)
management.properties文件看起来像这样:
com.sun.management.jmxremote.access.file=jmxremote.access
com.sun.management.jmxremote=true
com.sun.management.jmxremote.authenticate=true
com.sun.management.jmxremote.port=1234
com.sun.management.jmxremote.login.config=Sample
com.sun.management.jmxremote.ssl=false
com.sun.management.jmxremote.ssl.need.client.auth=false
Run Code Online (Sandbox Code Playgroud)
和sample_jaas.config:
Sample {
test.module.AETTLoginModule required debug=true;
};
Run Code Online (Sandbox Code Playgroud)
然后,用户将通过命令行中的JConsole登录来访问此运行进程.
jconsole -debug //or just jconsole
Run Code Online (Sandbox Code Playgroud)
用户选择"远程连接",使用RemoteProcess'localhost:1234'
loginmodule根据当前登录到Windows的用户处理用户验证和主体设置,用于查询单独的授权逻辑以确定访问级别.
我想要发生什么:
问题:
要在jconsole窗口中访问jmx进程,我必须输入一个虚拟用户名和密码,例如U:a,P:a,否则我收到以下错误:
java.lang.SecurityException: Authentication failed! Credentials required
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticationFailure(JMXPluggableAuthenticator.java:193)
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticate(JMXPluggableAuthenticator.java:145)
at sun.management.jmxremote.ConnectorBootstrap$AccessFileCheckerAuthenticator.authenticate(ConnectorBootstrap.java:201)
at javax.management.remote.rmi.RMIServerImpl.doNewClient(RMIServerImpl.java:213)
at javax.management.remote.rmi.RMIServerImpl.newClient(RMIServerImpl.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) …
Run Code Online (Sandbox Code Playgroud) 外部化身份的价值主张开始增加,许多网站现在接受OpenID,CardSpace或联合身份.但是,许多开发人员还没有采取下一步来外部化基于XACML的授权和使用方法.
是缺乏意识或其他原因的原因?您希望如何了解基于XACML的软件开发方法?
请注意,我询问授权,而不是身份验证.
我正在尝试保护使用JSF2.0构建的应用程序.
我很困惑人们什么时候选择使用像Shiro,Spring Security或owasp的esapi这样的安全替代品来留下容器管理的安全性.看过Stack Overflow上的一些相关问题后,我意识到JSF开发人员过去更喜欢基于容器的安全性.但我也强烈建议使用Apache Shiro.我是安全问题的新手,不知道可能是什么相关问题以及如何处理它们.因此,我正在寻找通过其默认设置/自己处理大多数安全问题的东西.
就我的应用程序需求而言,我有一个社交应用程序,具有不同角色的用户可以访问不同的页面集,并可以根据他们的角色在这些页面上使用不同级别的功能.
在那种情况下,您认为对我来说可能是一个很好的选择吗?
我个人已经确信选择Shiro,因为它易于使用并且为新手照顾大部分事情.
请帮我解决kerberos + Java问题.我有一个简单的Java程序,可以使用Kerberos对Windows Active Directory进行身份验证.以下java代码工作正常没有任何问题,并打印真实 -
public class KerberosAuthenticator {
public static void main(String[] args) {
String jaasConfigFilePath = "/myDir/jaas.conf";
System.setProperty("java.security.auth.login.config", jaasConfigFilePath);
System.setProperty("java.security.krb5.realm", "ENG.TEST.COM");
System.setProperty("java.security.krb5.kdc","winsvr2003r2.eng.test.com");
boolean success = auth.KerberosAuthenticator.authenticate("testprincipal", "testpass");
System.out.println(success);
}
}
Run Code Online (Sandbox Code Playgroud)
当我指定krb5.conf文件的路径而不是手动指定领域和kdc时,它会错误地说"Null领域名称(601) - 未指定默认领域".以下是代码 -
public class KerberosAuthenticator {
public static void main(String[] args) {
String jaasConfigFilePath = "/myDir/jaas.conf";
System.setProperty("java.security.auth.login.config", jaasConfigFilePath);
String krb5ConfigFilePath = "/etc/krb5/krb5.conf";
System.setProperty("java.security.krb5.conf", krb5ConfigFilePath);
boolean success = auth.KerberosAuthenticator.authenticate("testprincipal", "testpass");
System.out.println(success);
}
}
Run Code Online (Sandbox Code Playgroud)
krb5.conf的内容如下 -
[libdefault]
default_realm = ENG.TEST.COM
[realms]
ENG.TEST.COM = {
kdc = winsvr2003r2.eng.test.com …
Run Code Online (Sandbox Code Playgroud) 我正在使用glassfish和jaas模块.
我以这种方式配置了我的web.xml.
<security-constraint>
<web-resource-collection>
<web-resource-name>ALL Page for admin</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>file</realm-name>
</login-config>
<security-role>
<description>Administrator</description>
<role-name>user</role-name>
</security-role>
Run Code Online (Sandbox Code Playgroud)
这意味着所有想要访问我的Web应用程序的用户都需要是组用户.
然后在glassfish控制台上我需要勾选选项:Configuration - > server-config - > security - > Default Principal To Role Mapping
我的问题是为什么我需要将此默认主体勾选到角色映射?我如何更改我的web.xml以避免勾选它?
非常感谢
卢瓦克
我们正在使用JAAS在使用Windows Kerberos票证缓存的Java应用程序中启用单点登录.我们的jaas.conf配置文件如下所示:
LoginJaas {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
doNotPrompt=true
debug=true;
};
Run Code Online (Sandbox Code Playgroud)
有了这个,我们可以创建一个Jaas LoginContext并成功获取用户的Kerberos票证.我们使用JMI将此票证发送到服务器应用程序.我们无法做的是在服务器上验证Kerberos票证实际上是由我们的Active Directory创建的.
目前,我们通过简单检查服务器主体(KerberosTicket.getServer())名称是否在领域部分中具有我们的域名来对票证进行非常不安全的验证.但是,当然,任何人都可以使用相同的域名设置自己的Kerberos服务器,并使用该票证来启动应用程序.
我发现的一个想法是使用Kerberos票证对Active Directory LDAP进行身份验证.遗憾的是,我们使用Windows 7并重新使用Kerberos票证对LDAP进行身份验证仅在设置注册表项时有效(请参阅http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss /tutorials/Troubleshooting.html,搜索allowtgtsessionkey).这对我们的用户来说是不可接受的.
有没有办法根据我们的Active Directory服务器验证票证?我怀疑有办法检查KerberosTicket.getServer()票证是否等于我们服务器的票证,但我不知道该怎么做.更新:KerberosTicket().getServer()仅返回KerberosPrincipal,它只包含服务器票证名称和域,因此不适合验证.
感谢您的帮助,memminger