package message.security.service;
import message.security.SecurityConstants;
import message.security.exception.SecurityException;
import message.security.pojo.Account;
import message.security.pojo.Role;
import message.utils.EncryptUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import javax.servlet.http.HttpServletRequest;
/**
* 提供用户注册、修改等功能.
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0
* @createTime 2014-12-5 20:20
*/
@Component
public class Authc {
@Autowired
private AccountService accountService;
@Autowired
private Authz authz;
/**
* 注册用户
*
* @param loginName 登录名
* @param password 密码(明文)
* @param roles 所属角色的code
* @return
*/
public Account register(String loginName, String password, String[] roles) {
Assert.hasText(loginName, "用户名必填!");
Assert.hasText(password, "密码必填!");
if (isExist(loginName)) {
throw new SecurityException(SecurityConstants.SECUTIRY_EXCEPTION_CODE, "用户名为'{0}'的用户已存在!", loginName);
}
Account account = null;
try {
account = this.accountService.save(new Account(loginName, password));
} catch (Exception e) {
e.printStackTrace();
}
if (roles != null && roles.length > 0) {
//保存关系
this.accountService.saveAccountRole(roles, loginName);
}
return account;
}
/**
* 判断用户名是否存在
*
* @param loginName 用户名
* @return true 存在 false 不存在
*/
public boolean isExist(String loginName) {
Account account = this.accountService.loadAccount(loginName);
return account != null;
}
/**
* 登录校验
*
* @param request
* @param loginName 登录名
* @param password 密码(明文)
* @return
*/
public Account login(HttpServletRequest request, String loginName, String password) {
Assert.hasText(loginName, "用户名必填!");
Assert.hasText(password, "密码必填!");
Account account = this.accountService.loadAccount(loginName);
if (account != null && EncryptUtils.encodeMD5(password).equals(account.getPassword())) {
this.putInSession(request, account);
return account;
}
return null;
}
/**
* 登出
*
* @param request
* @return
*/
public boolean logout(HttpServletRequest request) {
if(this.authz.isLogin(request)) {
request.getSession().removeAttribute(SecurityConstants.ACCOUNT_KEY_IN_SESSION);
return true;
}
return false;
}
private void putInSession(HttpServletRequest request, Account account) {
request.getSession().setAttribute(SecurityConstants.ACCOUNT_KEY_IN_SESSION, account);
}
/**
* 修改密码
*
* @param loginName 登录名
* @param oldPassword 愿密码(明文)
* @param password 新密码(明文)
* @return
*/
public boolean chgPwd(String loginName, String oldPassword, String password) {
Assert.hasText(loginName, "用户名必填!");
Assert.hasText(oldPassword, "愿密码必填!");
Assert.hasText(password, "密码必填!");
Account account = this.accountService.loadAccount(loginName);
if (account == null) {
return false;
}
if (!EncryptUtils.encodeMD5(password).equals(account.getPassword())) {
return false;
}
return this.accountService.chgPwd(loginName, password);
}
/**
* 修改账户的角色
*
* @param loginName 账户
* @param roleCodes 新的角色集合
*/
public void chgAccountRole(String loginName, String[] roleCodes) {
Assert.hasText(loginName, "用户名必填!");
if (roleCodes != null && roleCodes.length > 0) {
//保存关系
this.accountService.saveAccountRole(roleCodes, loginName);
}
}
/**
* 保存角色
*
* @param roleCode 角色code
* @return
*/
public Role saveRole(String roleCode) {
Assert.hasText(roleCode, "角色code必填!");
Role role = this.accountService.loadRole(roleCode);
if (role == null) {
throw new SecurityException(SecurityConstants.SECUTIRY_EXCEPTION_CODE, "code为'{0}'的角色已存在!", roleCode);
}
try {
role = this.accountService.saveRole(new Role(roleCode));
} catch (Exception e) {
e.printStackTrace();
}
return role;
}
}