Springboot+shiro單點登入實現
阿新 • • 發佈:2019-01-03
import com.ymatou.envmanagement.model.User; import com.ymatou.envmanagement.util.SessionUtil; import com.ymatou.envmanagement.util.WapperUtil; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("") public class LoginController { private final static Logger logger = LoggerFactory.getLogger(LoginController.class); @RequestMapping("/auth") public Object auth(String username, String password) { String errorMessage = "未知錯誤!"; if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) { // 得到Subject及建立使用者名稱/密碼身份驗證Token(即使用者身份/憑證) Subject currentUser = SecurityUtils.getSubject(); // 如果使用者已經登入 if (currentUser.isAuthenticated()) { return WapperUtil.success("該使用者已經登入!"); } if(username.equals("admin") && password.equals("admin")) { // 獲取已認證使用者User User user = new User(); user.setUsername(username); user.setPassword(password); // 增加使用者的相關資料進入Session addUserInfoToSession(user); return WapperUtil.success("登入成功"); } // 登入Token驗證 UsernamePasswordToken token = new UsernamePasswordToken(username, password, true); try { currentUser.login(token); // 判斷使用者是否已經認證 if (currentUser.isAuthenticated()) { // 獲取已認證使用者User User user = new User(); user.setUsername(username); user.setPassword(password); // 增加使用者的相關資料進入Session addUserInfoToSession(user); return WapperUtil.success("登入成功"); } } catch (AuthenticationException e) { // 登入失敗 errorMessage = e.getCause() != null ? e.getCause().getMessage() : e.getMessage(); logger.info("登入失敗", e); } catch (Exception e) { errorMessage = "未知錯誤!"; logger.info("登入失敗", e); } } else { errorMessage = "使用者名稱或密碼為空!"; } return WapperUtil.error(errorMessage); } /** * 增加使用者的資訊到session中 */ private void addUserInfoToSession(User user) { // 設定使用者的資訊到session中 SessionUtil.put(SessionUtil.SESSION_KEY_USER_ID, user.getUsername()); SessionUtil.put(SessionUtil.SESSION_KEY_USER, user); } @RequestMapping("/logout") public Object logout() { Subject subject = SecurityUtils.getSubject(); if (subject.isAuthenticated()) { subject.logout(); return WapperUtil.success(); } return WapperUtil.error("您還未登入!"); } @RequestMapping("/version") public String version() { return "2017-03-09-1"; } @RequestMapping("/warmup") public String status() { return "ok"; } }
具體原理參考:http://blog.csdn.net/catoop/article/details/50520958