ldap authentication support

This commit is contained in:
Shinsuke Sugaya 2015-12-24 17:02:18 +09:00
parent bb3311ddd5
commit 28c51e9eba
8 changed files with 69 additions and 38 deletions

View file

@ -20,8 +20,8 @@ import javax.annotation.Resource;
import org.codelibs.fess.Constants;
import org.codelibs.fess.app.web.RootAction;
import org.codelibs.fess.app.web.login.LoginAction;
import org.codelibs.fess.entity.FessUser;
import org.codelibs.fess.es.user.exbhv.UserBhv;
import org.codelibs.fess.es.user.exentity.User;
import org.codelibs.fess.exception.UserRoleLoginException;
import org.codelibs.fess.mylasta.action.FessUserBean;
import org.codelibs.fess.mylasta.direction.FessConfig;
@ -40,7 +40,7 @@ import org.lastaflute.web.login.option.LoginSpecifiedOption;
* @author jflute
* @author shinsuke
*/
public class FessLoginAssist extends TypicalLoginAssist<String, FessUserBean, User> // #change_it also UserBean
public class FessLoginAssist extends TypicalLoginAssist<String, FessUserBean, FessUser> // #change_it also UserBean
implements LoginManager {
// ===================================================================================
@ -67,8 +67,8 @@ public class FessLoginAssist extends TypicalLoginAssist<String, FessUserBean, Us
}
@Override
public OptionalEntity<User> findLoginUser(String username, String password) {
OptionalEntity<User> ldapUser = ComponentUtil.getLdapManager().login(username, password);
public OptionalEntity<FessUser> findLoginUser(String username, String password) {
OptionalEntity<FessUser> ldapUser = ComponentUtil.getLdapManager().login(username, password);
if (ldapUser.isPresent()) {
return ldapUser;
}
@ -76,25 +76,25 @@ public class FessLoginAssist extends TypicalLoginAssist<String, FessUserBean, Us
}
@Override
protected OptionalEntity<User> doFindLoginUser(final String username, final String cipheredPassword) {
protected OptionalEntity<FessUser> doFindLoginUser(final String username, final String cipheredPassword) {
return userBhv.selectEntity(cb -> {
cb.query().setName_Equal(username);
cb.query().setPassword_Equal(cipheredPassword);
});
}).map(user -> (FessUser) user);
}
@Override
protected OptionalEntity<User> doFindLoginUser(final String username) {
protected OptionalEntity<FessUser> doFindLoginUser(final String username) {
return userBhv.selectEntity(cb -> {
cb.query().setName_Equal(username);
});
}).map(user -> (FessUser) user);
}
// ===================================================================================
// Login Process
// =============
@Override
protected FessUserBean createUserBean(final User user) {
protected FessUserBean createUserBean(final FessUser user) {
return new FessUserBean(user);
}
@ -106,7 +106,7 @@ public class FessLoginAssist extends TypicalLoginAssist<String, FessUserBean, Us
}
@Override
protected void saveLoginHistory(final User user, final FessUserBean userBean, final LoginSpecifiedOption option) {
protected void saveLoginHistory(final FessUser user, final FessUserBean userBean, final LoginSpecifiedOption option) {
asyncManager.async(() -> {
insertLogin(user);
});

View file

@ -0,0 +1,13 @@
package org.codelibs.fess.entity;
import java.io.Serializable;
public interface FessUser extends Serializable {
String getName();
String[] getRoleNames();
String[] getGroupNames();
}

View file

@ -18,13 +18,14 @@ package org.codelibs.fess.es.user.exentity;
import java.util.Base64;
import org.codelibs.fess.Constants;
import org.codelibs.fess.entity.FessUser;
import org.codelibs.fess.es.user.bsentity.BsUser;
import org.codelibs.fess.util.StreamUtil;
/**
* @author FreeGen
*/
public class User extends BsUser {
public class User extends BsUser implements FessUser {
private static final long serialVersionUID = 1L;

View file

@ -15,16 +15,13 @@
*/
package org.codelibs.fess.helper.impl;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import javax.annotation.PostConstruct;
@ -33,7 +30,6 @@ import javax.servlet.http.HttpServletRequest;
import org.codelibs.core.crypto.CachedCipher;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.Constants;
import org.codelibs.fess.app.web.base.login.FessLoginAssist;
import org.codelibs.fess.helper.RoleQueryHelper;
import org.codelibs.fess.util.ComponentUtil;
@ -115,14 +111,7 @@ public class RoleQueryHelperImpl implements RoleQueryHelper, Serializable {
}
final FessLoginAssist fessLoginAssist = ComponentUtil.getComponent(FessLoginAssist.class);
fessLoginAssist.getSessionUserBean().ifPresent(
fessUserBean -> StreamUtil.of(fessUserBean.getRoles()).map(role -> Base64.getDecoder().decode(role)).map(role -> {
try {
return Optional.of(new String(role, Constants.UTF_8));
} catch (final IOException e) {
return null;
}
}).forEach(role -> role.ifPresent(roleList::add)));
fessLoginAssist.getSessionUserBean().ifPresent(fessUserBean -> StreamUtil.of(fessUserBean.getRoles()).forEach(roleList::add));
if (defaultRoleList != null) {
roleList.addAll(defaultRoleList);

View file

@ -23,7 +23,7 @@ import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.es.user.exentity.User;
import org.codelibs.fess.entity.FessUser;
import org.codelibs.fess.filter.AdLoginInfoFilter;
import org.codelibs.fess.mylasta.direction.FessConfig;
import org.codelibs.fess.util.ComponentUtil;
@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
public class LdapManager {
private static final Logger logger = LoggerFactory.getLogger(AdLoginInfoFilter.class);
public OptionalEntity<User> login(String username, String password) {
public OptionalEntity<FessUser> login(String username, String password) {
FessConfig fessConfig = ComponentUtil.getFessConfig();
String providerUrl = fessConfig.getLdapProviderUrl();
@ -54,9 +54,9 @@ public class LdapManager {
if (logger.isDebugEnabled()) {
logger.debug("Logged in.", ctx);
}
return OptionalEntity.of(new LdapUser(username));
return OptionalEntity.of(createLdapUser(username, env));
} catch (NamingException e) {
logger.warn("Login failed.", e);
logger.debug("Login failed.", e);
} finally {
if (ctx != null) {
try {
@ -68,4 +68,8 @@ public class LdapManager {
}
return OptionalEntity.empty();
}
protected LdapUser createLdapUser(String username, Hashtable<String, String> env) {
return new LdapUser(env, username);
}
}

View file

@ -15,14 +15,38 @@
*/
package org.codelibs.fess.ldap;
import org.codelibs.fess.es.user.exentity.User;
import java.util.Hashtable;
public class LdapUser extends User {
import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.entity.FessUser;
public class LdapUser implements FessUser {
private static final long serialVersionUID = 1L;
public LdapUser(String username) {
setId(username);
protected Hashtable<String, String> env;
protected String name;
public LdapUser(Hashtable<String, String> env, String name) {
this.env = env;
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public String[] getRoleNames() {
// TODO
return StringUtil.EMPTY_STRINGS;
}
@Override
public String[] getGroupNames() {
// TODO
return StringUtil.EMPTY_STRINGS;
}
}

View file

@ -15,7 +15,7 @@
*/
package org.codelibs.fess.mylasta.action;
import org.codelibs.fess.es.user.exentity.User;
import org.codelibs.fess.entity.FessUser;
import org.codelibs.fess.util.StreamUtil;
import org.lastaflute.web.login.TypicalUserBean;
@ -29,7 +29,7 @@ public class FessUserBean extends TypicalUserBean<String> { // #change_it also L
// ==========
/** The serial version UID for object serialization. (Default) */
private static final long serialVersionUID = 1L;
private final User user;
private final FessUser user;
// ===================================================================================
// Attribute
@ -38,7 +38,7 @@ public class FessUserBean extends TypicalUserBean<String> { // #change_it also L
// ===================================================================================
// Constructor
// ===========
public FessUserBean(final User user) {
public FessUserBean(final FessUser user) {
this.user = user;
}
@ -54,11 +54,11 @@ public class FessUserBean extends TypicalUserBean<String> { // #change_it also L
// Accessor
// ========
public String[] getRoles() {
return user.getRoles();
return user.getRoleNames();
}
public String[] getGroups() {
return user.getGroups();
return user.getGroupNames();
}
public boolean hasRole(final String role) {

View file

@ -294,7 +294,7 @@
<label for="ldapProviderUrl"
class="col-sm-3 control-label"><la:message
key="labels.ldapProviderUrl" /></label>
<div class="form-inline col-sm-9">
<div class="col-sm-9">
<la:errors property="ldapProviderUrl" />
<la:text property="ldapProviderUrl"
styleClass="form-control" />
@ -304,7 +304,7 @@
<label for="ldapSecurityPrincipal"
class="col-sm-3 control-label"><la:message
key="labels.ldapSecurityPrincipal" /></label>
<div class="form-inline col-sm-9">
<div class="col-sm-9">
<la:errors property="ldapSecurityPrincipal" />
<la:text property="ldapSecurityPrincipal"
styleClass="form-control" />