jfinal使用shiro實現登陸功能,及Realm的使用

如今開始實現框架的登陸受權功能。java

1.從客戶端獲取用戶名,密碼,是否記住等信息,生成token,經過subject.login(token)進行登陸驗證,以下:web

public void login()
{
    String username = getPara("username");
    String password = getPara("password");
    String rememberMe = getPara("rememberMe");
    UsernamePasswordToken token = new UsernamePasswordToken(username, password, StrKit.notBlank(rememberMe) ? true : false);
    Subject subject = SecurityUtils.getSubject();
    try
    {
        //登陸,即身份驗證
        subject.login(token);
        redirect("/");
        return;
    }
    catch (AuthenticationException e)
    {
        //身份驗證失敗
    }
}

2.這裏再簡單敘述下驗證及受權流程,做爲上幾篇認證和受權的總結。框架

(1)啓動jfinal,會首先加載web.xml,並實例化裏面的類,這裏會建立EnvironmentLoaderListener的實例。EnvironmentLoaderListener在容器啓動時建立 WebEnvironment 對象,並由該對象來讀取 Shiro 配置文件,建立WebSecurityManager 與 FilterChainResolver 對象,同時建立一些有用的內置過濾器實例,而且自動的在[main]部分使用。如.ini文件配置,要使用authc,先定義其使用的類,這個類必須實現AuthenticatingFilter。ide

(2)調用方法subject.login(token)進行登陸,最終委託接口SecurityManage的實現類的login方法。code

(3)調用login方法的過程是:Authenticator會把相應的token傳入Realm,從Realm獲取身份驗證信息,權限信息,而後進行身份驗證和權限驗證。xml

(4)ShiroRealm具體實現以下:對象

public class ShiroRealm extends AuthorizingRealm
{

    // 用戶服務類
    private final UserService userService = UserService.me();
    // 角色服務類
    private final RoleService roleService = RoleService.me();
    // 權限服務類
    private final PermissionService permissionService = PermissionService.me();

    /**
     * 獲取登陸用戶擁有的角色和權限
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)
    {
        String username = (String)principals.getPrimaryPrincipal();//當前登陸用戶名
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        User user = userService.findByUsername(username); //根據用戶名查找用戶信息
        List<Role> roles = roleService.findRolesByUserId(user.getId());//根據用戶名查找角色
        if(roles != null && roles.size() > 0)
        {
            for(Role role : roles)
            {
                authorizationInfo.addRole(role.getName());//將當前用戶名下的角色存入authorizationInfo
            }
        }
        List<Permission> permissions = permissionService.findUserPermsByUserId(user.getId());
        if(permissions != null && permissions.size() > 0)
        {
            for(Permission permission : permissions)
            {
                authorizationInfo.addStringPermission(permission.getPermissionName());//將當前用戶名下的權限存入authorizationInfo
            }
        }
        return authorizationInfo;
    }

    /**
     * 驗證用戶是否合法 
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException
    {
        String username = (String)token.getPrincipal();  //當前登陸用戶名
        User user = userService.findByUsername(username); //根據用戶名查找用戶信息
        if(StrKit.isBlank(username))
        {
            throw new AuthenticationException("用戶名不能夠爲空");
        }
        if (user == null)
        {
            throw new AuthenticationException("用戶名或者密碼錯誤");
        }
        return new SimpleAuthenticationInfo(user, user.getPassword(), getName()); //存入查詢用戶信息
    }
}
相關文章
相關標籤/搜索