1. 程式人生 > >Springboot+shiro單點登入實現

Springboot+shiro單點登入實現

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