登录集成

本文说明如何在自己的业务系统中引入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);

results matching ""

    No results matching ""