如今開始實現框架的登陸受權功能。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()); //存入查詢用戶信息 } }