我想知道当前的方法是关于使用JSF 2.0(如果存在任何组件)和Java EE 6核心机制(登录/检查权限/注销)的Web应用程序的用户身份验证,其中包含用户信息保存在JPA中实体.Oracle Java EE教程在这方面有点稀疏(仅处理servlet).
这没有使用整个其他框架,如Spring-Security(acegi)或Seam,但如果可能的话,试图用新的Java EE 6平台(Web配置文件).
我通过托管bean以这种方式获取连接用户的用户名(使用j_security_check):
......
username = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName();
Run Code Online (Sandbox Code Playgroud)
然后以这种方式在jsf页面中显示它:#{userBean.username}
但我认为无法获得连接用户的数量并获得他们的角色.换句话说,除了用户名,用户角色和连接用户数之外,我还要显示.
我怎样才能做到这一点!?在此先感谢您的帮助!
编辑:我现在可以使用托管bean中的namedquery获取连接用户的角色:
public Users getUserRole(){
try {
Users auser = (Users)
em.createNamedQuery("Users.findByUsername").
setParameter("username", getRemoteUser()).getSingleResult();
return auser;
} catch (NoResultException nre) {
JsfUtil.addErrorMessage(nre, "getUserRole Error");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
并在xhtml页面中:
<h:outputLabel for="rolefacet" value="Role: "/>
<h:outputFormat id="rolefacet" value="#{UserBean.userRole.ugroup}" />
Run Code Online (Sandbox Code Playgroud)
而ugroup是Users实体类中的角色名称.
编辑:一个仍然不适合我的解决方案是在我的web.xml中添加一个HttpSessionListener:
package beans;
/**
*
* @author med81
*/
import java.io.Serializable;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.ArrayList;
import javax.faces.context.FacesContext;
public class SessionCounter implements …Run Code Online (Sandbox Code Playgroud) 我正在做一个记录用户操作的审计系统.我需要记录用户执行登录的时间.我搜索了不同的地方,但我总是遇到同样的解决方案,使用"过滤器".
以上解决方案对我不起作用.没有其他解决方案使用过滤器或进行自定义登录?
我正在使用带有GlassFish 3的Java 7
我正在学习Tomcat环境下的Java servlet.我正在学习如何使用j_security_check使用基于表单的登录身份验证.所以,在我的servlet中,我有一个具有j_username和j_password的登录页面.在该servlet的web.xml文件中,我有一个欢迎页面列表,指示我的登录页面"landing.html".因此,理想情况下,成功登录后,我希望用户重定向到"landing.html"页面.
如果没有身份验证(没有基于表单的身份验证),我的servlet会打开并按预期转到"landing.html"页面("localhost:8080/MyServlet" - 显示landing.html的内容).
但是,现在,在成功登录j_security_check之后,出于某种原因,我会自动重定向到.landing文件的.css文件.我不明白为什么会这样.
是否有一种特殊方式可以告诉服务器在成功验证后加载"landing.html"页面而不将其转发到其他任何地方?
编辑
*好的,我解决了.成功验证后加载的css文件列在<head></head>login.html页面的标签中,其中j_username和j_password是.我添加了css文件,使登录页面的设计与网站的其余部分一致.我的猜测是,当服务器重新加载所需资源时,由于某种原因,它只是从头标记重新加载顶部css文件.真的很奇怪.那么,j_security_check是对Tomcat上的网站进行任何身份验证的最佳方式,还是有更好更可靠的方式?*
我有一个不受保护的JSF页面j_security_check.我执行以下步骤:
Firebug显示a ViewExpiredException正如预期的那样被提升.
帖子:
Run Code Online (Sandbox Code Playgroud)javax.faces.ViewState=8887124636062606698:-1513851009188353364响应:
Run Code Online (Sandbox Code Playgroud)<partial-response> <error> <error-name>class javax.faces.application.ViewExpiredException</error-name> <error-message>viewId:/viewer.xhtml - View /viewer.xhtml could not be restored.</error-message> </error> </partial-response>
但是,一旦我将页面配置为受保护j_security_check并执行上面列出的相同步骤,奇怪的是(对我而言)ViewExpiredException不再引发.相反,响应只是一种新的视图状态.
帖子:
Run Code Online (Sandbox Code Playgroud)javax.faces.ViewState=-4873187770744721574:8069938124611303615响应:
Run Code Online (Sandbox Code Playgroud)<partial-response> <changes> <update id="javax.faces.ViewState">234065619769382809:-4498953143834600826</update> </changes> </partial-response>
有人可以帮我解决这个问题吗?我希望它引发异常,以便我可以处理该异常并显示错误页面.现在它只是响应一个新的ViewState,我的页面卡住了没有任何视觉反馈.
我正在尝试使用Apache HttpClient Java库对使用基于表单的身份验证(例如,facebook.com)的网站进行身份验证.
使用这个网站的程序作为一个主要的例子:http://www.elitejavacoder.com/2013/10/http-client-form-based-authentication.html,我能够做到 - 但有一些事情,我我不理解这个节目.这是代码:
package com.elitejavacoder.http.client;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.ClientPNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class HttpClientFormAuthentication {
public static void main(String[] agrs) {
String host = "yourhostname.com";
int port = 8080;
String protocol = "http";
DefaultHttpClient client = new DefaultHttpClient();
try {
HttpHost httpHost = new HttpHost(host, port, protocol);
client.getParams().setParameter(ClientPNames.DEFAULT_HOST, httpHost);
HttpGet securedResource = new …Run Code Online (Sandbox Code Playgroud) java j-security-check form-authentication apache-httpclient-4.x
我在login.jsp上使用j_security_check.服务器是GlassFish Server 3.一切正常,当用户通过身份验证后,它会打开index.jsp.我的问题是我需要在index.jsp中获取j_username,但我找不到这样做的方法.我找到的所有解决方案都是Java,我需要一些适合我的jsp的东西.
有任何想法吗?非常感谢你提前!
我希望用户(允许登录我的网站)从MySQL数据库加载.为此,我想为我的Apache Tomcat 7应用程序服务器设置JDBCRealm.
我已经阅读了文档并使用JNDI资源(jdbc/foo4)创建了数据库连接.此资源有效(我已在我的应用程序中使用它来检索数据).这似乎不起作用,是一个领域与这个资源的链接.
我的配置文件如下所示:
SRC \主\ web应用程序\ META-INF\context.xml的
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/my-webapp">
<!-- works! -->
<Resource name="jdbc/foo4"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/foo4"
username="root"
password="root"
maxActive="8"
maxIdle="4"
maxWait="10000"
auth="Container"
/>
<!-- Does not seem to work?! -->
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/foo4"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"
roleNameCol="role_name"/>
</Context>
Run Code Online (Sandbox Code Playgroud)
在我的标准部署描述符中,我输入了以下内容:
SRC \主\ web应用\ WEB-INF\web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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/web-app_3_0.xsd">
<security-constraint>
<display-name>General Restriction</display-name>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<description>All resources in this application are protected.</description>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name> …Run Code Online (Sandbox Code Playgroud) 我有一个Web应用程序,我希望主页包含一个登录表单,以及其他数据.如果用户选择登录,则应将其重定向到另一个页面(例如login_success.jsp).我的问题是:我可以使用j_security_check机制登录,或者唯一的方法是使用托管bean来处理登录?
我的主页看起来像这样:
....
<form action="j_security_check" method="POST" name="loginForm">
<h:panelGrid columns="2">
<h:outputLabel id="userNameLabel" for="j_username" value="#{label.home_username}:" />
<h:inputText id="j_username" autocomplete="off" />
<h:outputLabel id="passwordLabel" for="j_password" value="#{label.home_password}:" />
<h:inputSecret id="j_password" autocomplete="off" />
<h:panelGroup>
<h:commandButton type="submit" value="Login" />
<h:commandButton type="reset" value="Clear" />
</h:panelGroup>
</h:panelGrid>
</form>
...
Run Code Online (Sandbox Code Playgroud)
如果我按下登录按钮,我得到 - > HTTP状态400 - 对表单登录页面的无效直接引用.很明显,j_security_check机制不知道在哪里"重定向",因为我以前没有请求过受保护的资源.
我有一个在JBoss 8.1上运行的应用程序,基于JAAS表单的登录(j_security_check),一切正常.
我的问题是:1)用户注销并在登录页面上重定向2)这里发生会话超时(用户不知道这一点)3)用户返回并正确登录=> BAM:他被重定向到j_security_check(URI以j_security_check结尾),但页面为空.
我的猜测是:JBoss不再知道先前请求的页面,因为会话超时发生并且此信息丢失.所以JBoss不知道在哪里发送现在登录的用户,页面保持空白.
我发现了一些帖子,但没有真正的答案/解决方案.谢谢你的帮助!