2011-04-14 11 views
5

ile basit bir XML belgesinin ayrıştırılması Web uygulamam için bir yetkilendirme filtresi oluşturmak istiyorum (Belirli sayfalara erişimi kısıtlayabilmek için). Alma şartlarını oluşturmak için muktedirJAXP (JEE6)

<access> 
    <buyer> 
     <page>buyoffer.xhtml</page> 
     <page>faq.xhtml</page> 
     <page>index.jsp</page> 
     <page>login.xhtml</page> 
     <page>main.xhtml</page> 
     <page>registrationSucceded.xhtml</page>  
    </buyer> 
    <seller> 
     <page>sellerpanel.xhtml</page> 
     <page>faq.xhtml</page> 
     <page>index.jsp</page> 
     <page>login.xhtml</page> 
     <page>main.xhtml</page> 
     <page>registrationSucceded.xhtml</page>  
    </seller> 
    <administrator> 
     <page>sellerpanel.xhtml</page> 
     <page>faq.xhtml</page> 
     <page>index.jsp</page> 
     <page>login.xhtml</page> 
     <page>main.xhtml</page> 
     <page>registrationSucceded.xhtml</page>  
    </administrator> 
</access> 

Sonra ben sayfaların değerini ayıklamak için ayrıştırma yapmak gerekir:

Ben her kullanıcı ziyarete izin verilen sayfaları ile basit bir .xml dosyası oluşturduk izin ver veya yönlendir (Bağla). Sadece bu sayfaların değerlerini xml'den nasıl çıkaracağınızı söylemek için birine ihtiyacım var. Bu i şimdiye kadar ne yaptığını geçerli: doFilter yöntemi içinde yorumlarında

public class RestrictPageFilter implements Filter { 

    private FilterConfig fc; 
    private DocumentBuilder builder; 
    private Document document; 

    public void init(FilterConfig filterConfig) throws ServletException { 
     // The easiest way to initialize the filter 
     fc = filterConfig; 
     // Get the file that contains the allowed pages 
     File f = new File("/allowedpages.xml"); 
     // Prepare the file parsing 
     try { 
      builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      document = builder.parse(f); 
     } catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest req = (HttpServletRequest) request; 
     HttpServletResponse resp = (HttpServletResponse) response; 
     HttpSession session = req.getSession(true); 
     String pageRequested = req.getRequestURL().toString(); 

     // Get the value of the current logged user 
     Role currentUser = (Role) session.getAttribute("userRole"); 
     if (currentUser != null) { 
      if(currentUser.getType().equals("BUYER")) { 
       //Loop BUYER Element of the .xml 
       //if pageRequested.contains(value of the page at buyer element)    
       // chain.doFilter(request, response); 
       // Else 
       // Redirect the user to the main page 
      } 
      else if(currentUser.getType().equals("SELLER")) { 
       //Same as above just for seller element 
      } 
      else if(currentUser.getType().equals("ADMINISTRATOR")) { 
       //Same as above just for administrator element 
      }   
     } 
    } 

    public void destroy() { 
     // Not needed 
    } 
} 

i yapmanız gerekenler açıklanmıştır. Birisi, kullanıcı türlerinin her biri için sayfa isimlerini bulmak için dosyada nasıl yinelemem gerektiği konusunda bana bir ipucu verebilir mi? İnternetten JAXP örneklerini takip etmeye çalışıyorum, ancak ihtiyaç duyduğumdan daha karmaşık.

Güncelleme xml WEB-INF/sınıfları saklanır İhtiyacınız olarak

cevap

9

Daha ziyade JAXB'yi kullanın. JAXP eski ve çok ayrıntılı bir API'dir. JAXB Javabeans üzerinde eğilir ve bu nedenle temiz ve nispeten kolaydır. İlk olarak, javax.xml.bind ek açıklamalarını kullanarak XML dosyasına 1: 1 eşleyen bir Javabean oluşturun.

@XmlRootElement 
public class Access { 

    @XmlElement 
    private User buyer; 

    @XmlElement 
    private User seller; 

    @XmlElement 
    private User administrator; 

    public User getBuyer() { 
     return buyer; 
    } 

    public User getSeller() { 
     return seller; 
    } 

    public User getAdministrator() { 
     return administrator; 
    } 

    public static class User { 

     @XmlElement(name="page") 
     private List<String> pages; 

     public List<String> getPages() { 
      return pages; 
     } 

    } 

} 

Sonra ( allowedpages.xml sınıf yolunda kökünde yerleştirilir varsayarak) eşlemek için aşağıdaki parçayı yürütün. Bunun için new File() KULLANMAYIN gerektiğini

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("allowedpages.xml"); 
Access access = (Access) JAXBContext.newInstance(Access.class).createUnmarshaller().unmarshal(input); 

Not. Ayrıca bkz. getResourceAsStream() vs FileInputStream. aşağıdaki gibi

Son olarak tüm alıcı sayfalara erişebilir:

List<String> buyerPages = access.getBuyer().getPages(); 
// ... 

Tabii o homegrowing güvenlik her zaman en iyi uygulama değildir demek. Java EE 6 konteyner yönetimli güvenlik ile birlikte gönderilir.

+0

+1 Ev güvenliği için en iyi uygulama değil – ahvargas

+0

Kaptan yönetilen güvenliği kullanmayı çok isterim çünkü daha iyi biliyorum, senaryoda bunu uygulamakta zorlanıyorum. Biraz daha öğrenene kadar bu yaklaşıma sadık kalacağım. S. web.xml dosyasına bir şey eklemem gerekir mi? – sfrj

+0

Hiçbir şey. Yukarıdaki, XML'i okumak için yapmanız gereken tek şey. JAXB zaten Java EE 6 kapları ile paketlenmiştir (Biliyorum Glassfish kullanıyorsun). Tomcat'ta ayrı olarak yüklemeniz ve yapılandırmanız gerekir. – BalusC

0

kullanım NodeList nodes = document.getElementsByTagName(tagname); etiketadı alıcı veya satıcı vb olmalıdır. Düğüm listesinde yineleyin ve verileri okuyun.

1

Neden tekerleği yeniden icat ediyorsunuz diye sorabilir miyim? Java EE 6 kullanıyorsanız, neden yaptığınız işe benzeyen yerleşik güvenlik mekanizmasını kullanmıyorsunuz, ancak doğada bildirim yapıyorsunuz?

Lütfen this article numaralı telefonu okuyun.

Esasen, web.xml bu yazma aşağı kaynar: Yukarıdaki örnek

<security-constraint> 
    <display-name>For users in buyer role</display-name> 
    <web-resource-collection> 
     <web-resource-name>Restricted Access - Buyers Only</web-resource-name> 
     <url-pattern>buyoffer.xhtml</url-pattern> 
     <url-pattern>faq.xhtml</url-pattern> 
     <url-pattern>index.jsp</url-pattern> 
     <url-pattern>login.xhtml</url-pattern> 
     <url-pattern>main.xhtml</url-pattern> 
     <url-pattern>registrationSucceded.xhtml</url-pattern> 
     <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>Buyer</role-name> 
    </auth-constraint> 
    <user-data-constraint> 
     <transport-guarantee>NONE</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

alıcı rolü içindir.

+0

Yönlendirmeyi burada nasıl kontrol edersiniz? – sfrj

+0

Doğru. Filtreye dayalı kimlik doğrulamayı yalnızca çok sofistike ürünlere uygun buldum. Örneğin, bazı kullanıcılara belirli bir süre için bazı haklar vermek için ablilite sahibi olmak istersiniz. Ve bütün bu "bağışlar" db içinde hatırlamak istiyorum. Olağan durum için, konteyner bazlı güvenlik yeterli ve etkilidir. – Zbyszek