package com.agentdriving.user.modular.api; import com.agentdriving.user.core.base.controller.BaseController; import com.agentdriving.user.core.base.tips.ErrorTip; import com.agentdriving.user.core.shiro.ShiroKit; import com.agentdriving.user.core.shiro.ShiroUser; import com.agentdriving.user.core.util.JwtTokenUtil; import com.agentdriving.user.modular.system.dao.UserMapper; import com.agentdriving.user.modular.system.model.User; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.crypto.hash.Md5Hash; import org.apache.shiro.util.ByteSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; /** * 接口控制器提供 * * @author stylefeng * @Date 2018/7/20 23:39 */ @RestController @RequestMapping("/gunsApi") public class ApiController extends BaseController { @Autowired private UserMapper userMapper; /** * api登录接口,通过账号密码获取token */ @RequestMapping("/auth") public Object auth(@RequestParam("username") String username, @RequestParam("password") String password) { //封装请求账号密码为shiro可验证的token UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password.toCharArray()); //获取数据库中的账号密码,准备比对 User user = userMapper.getByAccount(username); String credentials = user.getPassword(); String salt = user.getSalt(); ByteSource credentialsSalt = new Md5Hash(salt); SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo( new ShiroUser(), credentials, credentialsSalt, ""); //校验用户账号密码 HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher(); md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName); md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations); boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch( usernamePasswordToken, simpleAuthenticationInfo); if (passwordTrueFlag) { HashMap result = new HashMap<>(); result.put("token", JwtTokenUtil.generateToken(String.valueOf(user.getId()))); return result; } else { return new ErrorTip(500, "账号密码错误!"); } } /** * 测试接口是否走鉴权 */ @RequestMapping(value = "/test", method = RequestMethod.POST) public Object test() { return SUCCESS_TIP; } }