2016-05-11 17 views
0

私が使用しているページの例をコピーしました。現在のユーザーがadminの場合、フルメニューを表示して使用することができますが、ユーザーが通常の場合は、メニューのカットバージョンを見ることができます。問題は、通常のユーザーが管理者であるユーザーのみが使用する必要のあるURLを開くことができることです。SpringFramework jspが制限付きURLを設定するJAVA

: はlocalhost:8080/{ホストパス} /ユーザー - 唯一の管理者ユーザーはこのURLを開く必要がありますが、今、私は管理者と一般ユーザで開くことができます。

URLの一部を一般ユーザー向けに制限する方法はありますか?

<head> 
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> 

<link href="<c:url value="/resources/css/dom.css" />" rel="stylesheet"> 
<script src="<c:url value="/resources/js/dom.js" />"></script> 
<spring:message code="configure.app.path" var="hostpath" /> 
</head> 
<body> 
    <article class="mainWrapper"> 
    <div> 
     <c:choose> 
      <c:when test="${sessionScope.user.admin}"> 

       <c:choose> 
        <c:when test="${active == true}"> 

         <h1>ADMIN</h1> 
         <nav class="topNav"> 
          <ul> 
           <li class="selected"><a href="${hostpath}/home">Home</a></li> 
           <li><a href="${hostpath}/settings">Settings</a></li> 
           <li><a href="${hostpath}/users">Users</a></li> 
           <li><a href="${hostpath}/groups">Groups</a></li> 
           <li><a href="${hostpath}/pdata">PrivateData</a></li> 
           <li><a href="${hostpath}/secur">Security</a></li> 
          </ul> 
          </nav> 

        </c:when> 
        <c:otherwise> 

         <h1>ACTIVATE REGISRATION</h1> 
         <p>some explanation text</p> 

        </c:otherwise> 
       </c:choose> 

       <br class="clear" /> 
       <br /> 

      </c:when> 
      <c:otherwise> 

       <h1>USER</h1> 
       <nav class="topNav"> 
        <ul> 
         <li class="selected"><a href="${hostpath}/home">Home</a></li> 
         <li><a href="${hostpath}/pdata">PrivateData</a></li> 
         <li><a href="${hostpath}/secur">Security</a></li> 
        </ul> 
        </nav> 

      </c:otherwise> 
     </c:choose> 

    </div> 
    </article> 

</body> 
</html> 
+0

そして、質問はありますか? –

+0

@ Serge Ballesta URLの一部を通常のユーザーに限定する方法を教えてください。 – RockOrDead

+3

セキュリティを実装することで...何かを隠すということは、実際にはセキュリティではありません。実際のセキュリティを適用するにはSpringセキュリティを使用してください(URLを表示/非表示にするためにも使用します)。 –

答えて

1

問題を解決する方法はたくさんあります。 私がやる方法は、現在ログインしているユーザーを取得することです。現在のユーザーがいれば、アプリケーションで定義した方法に応じてそのユーザーの役割を取得し、そのユーザーをモデルに挿入することができます。また、JSPページではユーザーロールを比較できるようになりました。

このメソッドは、現在のLOGGEDINユーザー獲得:

public static User getCurrentUser() { 
    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    if (principal instanceof UserDetails) { 
     String email = ((UserDetails) principal).getUsername(); 
     loginUser = userService.findUserByEmail(email); 
     return new SecurityUser(loginUser); 
    } 

    return null; 
} 

、その後、あなたのモデルで、彼の現在のユーザーを注入:

@RequestMapping(value = "/users", method = RequestMethod.GET) 
public String getUserPage(Model model) { 
    User user = getCurrentUser(); 
    model.addAttribute("user", user); 
    return "users"; 
} 

今、あなたはあなたのJSP内でのユーザーの役割を比較することができます

<c:choose> 
     <c:when test="${user.role == 'ADMIN'}"> 

      <c:choose> 
       <c:when test="${active == true}"> 

        <h1>ADMIN</h1> 
        <nav class="topNav"> 
         <ul> 
          <li class="selected"><a href="${hostpath}/home">Home</a></li> 
          <li><a href="${hostpath}/settings">Settings</a></li> 
          <li><a href="${hostpath}/users">Users</a></li> 
          <li><a href="${hostpath}/groups">Groups</a></li> 
          <li><a href="${hostpath}/pdata">PrivateData</a></li> 
          <li><a href="${hostpath}/secur">Security</a></li> 
         </ul> 
         </nav> 

       </c:when> 
       <c:otherwise> 

        <h1>ACTIVATE REGISRATION</h1> 
        <p>some explanation text</p> 

       </c:otherwise> 
      </c:choose> 

      <br class="clear" /> 
      <br /> 

     </c:when> 
     <c:otherwise> 

ユーザーが複数の役割を持つことができる場合は、役割をループしてiを確認する必要があります彼はメニューを見るのに必要な役割を持っています。

は、まあ、私はそれは私が解決回るような方法があるので、これは、あなたを助けることができることを願って、それ

+0

あなたのソリューションの**大きな**問題は、リンクがUIでレンダリングされないようにすることです:誰かが手動で/ abc/unauthorized_url –

+0

私は自分の役割に応じてメニューを動的に表示したいと思っていましたが、アクセスをブロックしたいと言われたので、春のセキュリティ設定を変更することができます – billahill

+0

あなたのソリューションはリンクを隠すだけですが、定期的なユーザーのためのそれら。 – RockOrDead

1
あなたがそうでなければ、チェックインするJavaフィルターを作ることができ、ユーザのアクセス春のセキュリティを使用してページを制限することができます

その役割にはどのような役割があり、ページにアクセスする権限がない場合は、許可されていないページにリダイレクトされます。 あなたとあなたが開発しているアプリケーションの複雑さによって異なります。

1

フィルタを作成すると、あるユーザーが許可されていないURLと共有していてもアクセスできなくなります。

利用の基本的な例は、このようなものになるだろう:

public class UsersRestrictionFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) servletRequest; 
     logger.debug("URI: {}", request.getRequestURI()); 
     User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     //Here I use spring security from context 
     if (isRestrictedURL(request.getRequestURI()) && !user.isAdmin()) { 
      HttpServletResponse response = (HttpServletResponse) servletResponse; 
      response.sendRedirect(request.getServletContext().getContextPath() + "/notAllowedAccess"); 
     } 
     //if the user is allowed to access the url continue flow 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    private boolean isRestrictedURL(String url){ 
    //your logic to decide if the URL is only for admin users 
    } 

    @Override 
    public void destroy() { 
    } 

} 
関連する問題