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()); //存入查询用户信息
    }
}
相关文章
相关标签/搜索