Glassfish と netbeans を使用して Java EE アプリケーションを作成しました。hereからカスタムの柔軟な jdbc Realm をインストールしました。すべての指示に従い、以下に示すプロパティを使用しました(デフォルトとサーバー構成の両方)
datasource.jndi = jdbc/e-health
sql.seed = select salt from users where username = ?
sql.groups = select groupname from groups where username = ?
sql.password = select password from users where username = ?
password.encoding = BASE64
password.digest = SHA-256
jaas.context = myRealm
私の最初の質問は、default-config または server-config のどこにレルムを作成する必要があるかということです。
また、テーブルを使用してデータベース(E-Health)を作成しました:ユーザー、グループ
users: username, password, salt
groups: groupname, username(fk->users.username)
このレルムを使用したい理由は、salt でパスワードを暗号化したいからであり、jdbc レルムではこのオプションがありません!
私の問題は、ログインできないことです。
私は net Beans IDE を使用して、login および loginError ページを作成しました。
ログイン.JSP :
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login Page</title>
</head>
<body>
<form action="j_security_check" method="POST">
Username:<input type="text" name="j_username"><br>
Password:<input type="password" name="j_password">
<input type="submit" value="Login">
</form>
</body>
</html>
サーブレットで次のコードを使用してユーザーを作成しました。
if(userPath.equals("/createUser"))
{
String Type = request.getParameter("user_type");
String Id = request.getParameter("amka");
String Name = request.getParameter("name");
String Surname = request.getParameter("surname");
String Nickname = request.getParameter("nickname");
String Pass = request.getParameter("password");
String Email = request.getParameter("e-mail");
String City = request.getParameter("city");
String Street = request.getParameter("street");
String Phone = request.getParameter("phone");
String At = request.getParameter("at");
String Spec = request.getParameter("spec");
//byte[] b_pass = Pass.getBytes("UTF-8"); //Κρυπτογράφηση password
String salt = null;
String hash=null;
if ("doctor".equals(Type))
{
// ID = Integer.parseInt(Id);
MessageDigest md;
try {
Random r = SecureRandom.getInstance("SHA1PRNG");
salt=new BigInteger(130, r).toString(32);
md = MessageDigest.getInstance("SHA-256");
md.update(salt.getBytes("UTF-8"));
byte[] digest = md.digest();
salt=Base64.encodeBase64String(digest);
md.update(Pass.concat(salt).getBytes("UTF-8"));
digest = md.digest();
hash=Base64.encodeBase64String(digest); // μετατροπή σε Base64
}
catch (NoSuchAlgorithmException ex) {
Logger.getLogger(Servlet.class.getName()).log(Level.SEVERE, null, ex);
}
currentUser.setPassword(hash);
currentUser.setUsername(Nickname);
currentUser.setSalt(salt);
UsersFacade.create(currentUser);
currentGroup.setUsername(currentUser);
currentGroup.setGroupname(Type);
GroupsFacade.create(currentGroup);
/*
currentDoc.setIddoctors(ID);
currentDoc.setName(Name);
currentDoc.setSurname(Surname);
currentDoc.setNickname(Nickname);
currentDoc.setEmail(Email);
currentDoc.setCity(City);
currentDoc.setStreet(Street);
currentDoc.setPhone(Phone);
currentDoc.setSpec(Spec);
DoctorsFacade.create(currentDoc);
*/
}
私が作成したグループと役割は、医師、薬局、マイクロ、患者、管理者です。
web.xml と glassfish-web.xml でロールを作成しました。
Web.XML
<session-config>
<session-timeout>
1
</session-timeout>
</session-config>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/view/error.jsp</location>
</error-page>
<security-constraint>
<display-name>AdminOnly</display-name>
<web-resource-collection>
<web-resource-name>admin</web-resource-name>
<description/>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admins</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>DocOnly</display-name>
<web-resource-collection>
<web-resource-name>doctor1</web-resource-name>
<url-pattern>/view/doc_index.jsp</url-pattern>
</web-resource-collection>
<web-resource-collection>
<web-resource-name>doctor2</web-resource-name>
<description/>
<url-pattern>/view/doctor.jsp</url-pattern>
</web-resource-collection>
<web-resource-collection>
<web-resource-name>doctor3</web-resource-name>
<description/>
<url-pattern>/view/history.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>doctors</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>PharmOnly</display-name>
<web-resource-collection>
<web-resource-name>pharm</web-resource-name>
<description/>
<url-pattern>/view/pharm.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>pharms</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>MicroOnly</display-name>
<web-resource-collection>
<web-resource-name>micro</web-resource-name>
<description/>
<url-pattern>/view/micro.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>micros</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>PatOnly</display-name>
<web-resource-collection>
<web-resource-name>patient</web-resource-name>
<description/>
<url-pattern>/view/patient.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>patients</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>myRealm</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/loginError.html</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description/>
<role-name>admins</role-name>
</security-role>
<security-role>
<description/>
<role-name>doctors</role-name>
</security-role>
<security-role>
<description/>
<role-name>pharms</role-name>
</security-role>
<security-role>
<description/>
<role-name>micros</role-name>
</security-role>
<security-role>
<description/>
<role-name>patients</role-name>
</security-role>
<resource-ref>
<res-ref-name>jdbc/e-health</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
GLASSFISH-WEB.XML
<glassfish-web-app error-url="">
<security-role-mapping>
<role-name>doctors</role-name>
<group-name>doctors</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>micros</role-name>
<group-name>micros</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>pharms</role-name>
<group-name>pharms</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>patients</role-name>
<group-name>patients</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>admins</role-name>
<group-name>admins</group-name>
</security-role-mapping>
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class' java code.</description>
</property>
</jsp-config>
</glassfish-web-app>
まず、サーブレットでこの注釈を作成しました。
@ServletSecurity(
@HttpConstraint(rolesAllowed = {"doctors"})
)
資格情報は次のとおりです。
ユーザー名:John パスワード(ソルト付き) :kwkBo2sKjPHPvqFTQReMGS8Cbj8PbAoFxvuk ソルト:4b8mHanRWrI9HitaES4s8x5F05WWFz3IN3+Hjp7XtRg=
と
ユーザー名: John グループ名: 医師
暗号化されたパスワードは次のとおりです: 12345
私は何を間違えましたか?
資格情報をフォームに入力しました: John/12345 とエラー ページが表示されます。
パスワードを何らかの方法で復号化する必要がありますか? これはレルム自体で機能しませんか?