登录集成
本文说明如何在自己的业务系统中引入BaskReport Console的功能。
假设你当前项目已经有用户登录模块和页面框架,下文这种描述登录逻辑的处理
实现SecurityProvider
首先需要实现com.basksoft.report.console.security.provider.SecurityProvider接口的实现类:
public interface SecurityProvider {
/**
* 获取登录用户对象
* @param req HttpServletRequest
* @return 返回用户对象
*/
User getLoginUser(HttpServletRequest req);
/**
* 执行登录操作
* @param req HttpServletRequest
* @param account 账号
* @param password 密码
*/
void login(HttpServletRequest req, String account,String password);
/**
* 执行登出操作
* @param req HttpServletRequest
*/
void logout(HttpServletRequest req);
}
在该实现类中实现内部的三个方法。
BaskReport中提供了ServiceLoader的扩展机制,你可以利用ServiceLoader定义一个SecurityProvider的扩展类并配置到系统中。
参考实现:
public class DefaultSecurityProvider implements SecurityProvider {
private static final String LOGIN_USER="_baskreport_login_user";
@Override
public User getLoginUser(HttpServletRequest req) {
Object obj = req.getSession().getAttribute(LOGIN_USER);
if (obj!=null) {
return (User)obj;
} else {
return null;
}
}
@Override
public void login(HttpServletRequest req, String account, String password) {
com.basksoft.report.core.database.model.User user = UserServiceManager.getUserService().validate(account, password);
List<Role> roles = user.getRoles();
List<Long> roleCodes = new ArrayList<Long>();
if (roles!=null) {
for (Role role:roles) {
roleCodes.add(role.getId());
}
}
User loginUser = new DefaultUser(account, user.getUsername(), user.isEnable(), user.isAdmin(), roleCodes);
req.getSession().setAttribute(LOGIN_USER, loginUser);
}
@Override
public void logout(HttpServletRequest req) {
req.getSession().removeAttribute(LOGIN_USER);
}
}
通过以上的方法解决BaskReport Console的用户登录登出和用户信息获取的逻辑。
其中getLoginUser方法需要返回com.basksoft.report.console.security.entity.User对象,定义如下:
public interface User {
/**
* 获取用户账号
* @return 用户账号
*/
String getName();
/**
* 获取用户描述
* @return 用户描述
*/
String getDesc();
/**
* 是否管理员
* @return 是否管理员
*/
boolean isAdmin();
/**
* 获取用户角色列表
* @return 角色列表
*/
List<Long> getRoles();
}
这个对象有一个getRoles方法,这个方法是用来获取用户所属的角色列表。该逻辑关系是存储在BaskReport的系统表中的,所以我们可以通过一个特殊的方法获取用户对应的角色列表:
List<Role> roles = com.basksoft.report.core.database.manager.role.RoleManager.ins.getUserRoles(String account);
要确保getLoginUser返回的用户对象中有role信息,否则这个用户无法访问BaskReport中的任何资源。
用户登录
在登录页面对应的登录逻辑的处理代码中调用如下代码,完成BaskReport的用户登录:
com.basksoft.report.console.security.SecurityUtils.getSecurityProvider().login(request, account, password);