shiroとwebsocketを使って単一ログイン

9329 ワード

shiroの配置は言わないで、ネット上はとても多くて、websocketの配置は私の別の文章を見ることができます:https://blog.csdn.net/qq_37838223/article/details/80419325

    org.springframework.boot
    spring-boot-starter-websocket


    com.github.theborakompanioni
    thymeleaf-extras-shiro
    1.2.1
private final Logger logger = LoggerFactory.getLogger(AuthRealm.class);
@Autowired
private SimpMessagingTemplate messagingTemplate;

//  ,  
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken tokens) throws AuthenticationException {
    UsernamePasswordToken token=(UsernamePasswordToken)tokens;//       token
    String username=token.getUsername();
    String password=new String(token.getPassword());
    User user=new User();
    user.setUsername(username);
    user.setPassword("123456");
    SessionsSecurityManager securityManager = (SessionsSecurityManager) SecurityUtils.getSecurityManager();
    DefaultSessionManager sessionManager = (DefaultSessionManager) securityManager.getSessionManager();
    Collection sessions = sessionManager.getSessionDAO().getActiveSessions();//          session  
        for (Session session : sessions) {
            User users = (User) (session.getAttribute("USER_IN_SESSION"));
            if (users != null) {
                if (username.equals(users.getUsername())&&password.equals(users.getPassword())) {
                    if(SecurityUtils.getSubject().getSession().getId().equals(session.getId())){
                        break;
                    }else {
                        logger.debug(username + "   ,      session");
                        sessionManager.getSessionDAO().delete(session);
                        messagingTemplate.convertAndSendToUser(username, "/queue/message", new WiselyResponse("           !"));
                    }
                }
            }
        }
    SimpleAuthenticationInfo ai=new SimpleAuthenticationInfo(user,user.getPassword(),this.getClass().getName());//  shiro.  CredentialsMatcher    
    return ai;
}
<span style="color:#9876aa;">th</span><span style="color:#bababa;">:inline=</span><span style="color:#a5c261;">"javascript"</span><span style="color:#e8bf6a;">>
</span><span style="color:#e8bf6a;">   </span><span style="color:#808080;">// var session=[[session.USER_IN_SESSION]];
</span><span style="color:#808080;">       </span><span style="color:#cc7832;font-weight:bold;">var </span>user=[[${session.USER_IN_SESSION.username}]]<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">       </span><span style="color:#cc7832;font-weight:bold;">var </span>socket = <span style="color:#cc7832;font-weight:bold;">new </span>SockJS(<span style="color:#6a8759;">'/endpointWisely'</span>)<span style="color:#cc7832;">; </span><span style="color:#808080;">//1
</span><span style="color:#808080;">       </span>stompClient = <span style="color:#9876aa;">Stomp</span>.<span style="color:#ffc66d;">over</span>(socket)<span style="color:#cc7832;">;</span><span style="color:#808080;">//2
</span><span style="color:#808080;">       </span><span style="color:#9876aa;">stompClient</span>.<span style="color:#ffc66d;">connect</span>({
           <span style="color:#9876aa;">name</span>: user
   }<span style="color:#cc7832;">, </span><span style="color:#cc7832;font-weight:bold;">function</span>(frame) {<span style="color:#808080;">//3</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">           </span><span style="color:#9876aa;">stompClient</span>.<span style="color:#ffc66d;">subscribe</span>(<span style="color:#6a8759;">'/user/queue/message'</span><span style="color:#cc7832;">, </span><span style="color:#cc7832;font-weight:bold;">function </span>(response) {
               <span style="color:#cc7832;font-weight:bold;">var </span>returnData = JSON.<span style="color:#ffc66d;">parse</span>(response.<span style="color:#9876aa;">body</span>)<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">               </span><span style="color:#ffc66d;">showResponse</span>(<span style="color:#6a8759;">"        :" </span>+ returnData.responseMessage)<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">           </span>})<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">       </span>})<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">
</span><span style="color:#cc7832;">       </span><span style="color:#cc7832;font-weight:bold;">function </span><span style="color:#ffc66d;">disconnect</span>() {
           <span style="color:#cc7832;font-weight:bold;">if </span>(<span style="color:#9876aa;">stompClient </span>!= <span style="color:#cc7832;font-weight:bold;">null</span>) {
               <span style="color:#9876aa;">stompClient</span>.<span style="color:#ffc66d;">disconnect</span>()<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">           </span>}
       }

       <span style="color:#cc7832;font-weight:bold;">function </span><span style="color:#ffc66d;">showResponse</span>(message) {
           <span style="color:#ffc66d;">alert</span>(message)
       }
<span style="color:#e8bf6a;">
参考のブログ:https://www.cnblogs.com/zhanying999666/p/8392592.html