Java tutorial
package cn.com.infcn.ade.system.service; import java.io.Serializable; import javax.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.session.Session; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Service; import cn.com.infcn.ade.common.utils.security.Encodes; import cn.com.infcn.ade.system.exception.LicenseException; import cn.com.infcn.ade.system.model.Permission; import cn.com.infcn.ade.system.model.User; import cn.com.infcn.ade.system.model.UserRole; import cn.com.infcn.ade.system.utils.UsernamePasswordCaptchaToken; import cn.com.infcn.superspider.service.CheckHandlerI; import com.google.common.base.Objects; /** * ?service(shrioRealm) * @author WChao * @date 2015114 */ @Service @DependsOn({ "userDao", "permissionDao", "rolePermissionDao" }) public class UserRealm extends AuthorizingRealm { @Autowired private UserService userService; @Autowired private PermissionService permissionService; @Autowired private CheckHandlerI checkHandler; /** * ?,. */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { try { checkHandler.checkExpireDate(); } catch (Exception e) { // TODO Auto-generated catch block throw new LicenseException(e.getMessage(), e); } UsernamePasswordCaptchaToken token = (UsernamePasswordCaptchaToken) authcToken; User user = userService.getUser(token.getUsername()); if (user != null && doCaptchaValidate(token)) { byte[] salt = Encodes.decodeHex(user.getSalt()); ShiroUser shiroUser = new ShiroUser(user.getId(), user.getLoginName(), user.getName()); //session Session session = SecurityUtils.getSubject().getSession(); session.setAttribute("user", user); return new SimpleAuthenticationInfo(shiroUser, user.getPassword(), ByteSource.Util.bytes(salt), getName()); } else { return null; } } /** * ?, ???. */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { ShiroUser shiroUser = (ShiroUser) principals.getPrimaryPrincipal(); User user = userService.getUser(shiroUser.loginName); //principalssession key=userId value=principals SecurityUtils.getSubject().getSession().setAttribute(String.valueOf(user.getId()), SecurityUtils.getSubject().getPrincipals()); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // for (UserRole userRole : user.getUserRoles()) { info.addRole(userRole.getRole().getName()); } //?? for (Permission permission : permissionService.getPermissions(user.getId())) { if (StringUtils.isNotBlank(permission.getPermCode())) info.addStringPermission(permission.getPermCode()); } //? userService.updateUserLogin(user); return info; } /** * ?? * @param token * @return boolean */ protected boolean doCaptchaValidate(UsernamePasswordCaptchaToken token) { /*String captcha = (String) SecurityUtils.getSubject().getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); if (captcha != null &&!captcha.equalsIgnoreCase(token.getCaptcha())){ throw new CaptchaException("???"); }*/ return true; } /** * PasswordHash. */ @SuppressWarnings("static-access") @PostConstruct public void initCredentialsMatcher() { HashedCredentialsMatcher matcher = new HashedCredentialsMatcher(userService.HASH_ALGORITHM); matcher.setHashIterations(userService.HASH_INTERATIONS); setCredentialsMatcher(matcher); } /** * AuthenticationSubject??????. */ public static class ShiroUser implements Serializable { private static final long serialVersionUID = -1373760761780840081L; public Integer id; public String loginName; public String name; public ShiroUser(Integer id, String loginName, String name) { this.id = id; this.loginName = loginName; this.name = name; } public Integer getId() { return id; } public String getName() { return name; } /** * <shiro:principal/>. */ @Override public String toString() { return loginName; } /** * ?hashCode,?loginName; */ @Override public int hashCode() { return Objects.hashCode(loginName); } /** * ?equals,?loginName; */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } ShiroUser other = (ShiroUser) obj; if (loginName == null) { if (other.loginName != null) { return false; } } else if (!loginName.equals(other.loginName)) { return false; } return true; } } @Override public void clearCachedAuthorizationInfo(PrincipalCollection principals) { super.clearCachedAuthorizationInfo(principals); } @Override public void clearCachedAuthenticationInfo(PrincipalCollection principals) { super.clearCachedAuthenticationInfo(principals); } @Override public void clearCache(PrincipalCollection principals) { super.clearCache(principals); } public void clearAllCachedAuthorizationInfo() { getAuthorizationCache().clear(); } public void clearAllCachedAuthenticationInfo() { getAuthenticationCache().clear(); } public void clearAllCache() { clearAllCachedAuthenticationInfo(); clearAllCachedAuthorizationInfo(); } }