मैं ग्लासफ़िश सर्वर 4.0 का उपयोग कर रहा हूं जिसमें मैंने विभिन्न उपयोगकर्ताओं को विभिन्न अधिकारियों/भूमिकाएं सौंपी हैं।जेएएएस में उनके अधिकार/भूमिका के अनुसार प्रत्येक उपयोगकर्ता को किसी विशिष्ट स्थान पर संसाधनों का उपयोग कैसे करें?
उपयोगकर्ता के पास एकाधिक प्राधिकरण/भूमिकाएं हो सकती हैं। उदाहरण के लिए, एक व्यवस्थापक उपयोगकर्ता ROLE_ADMIN
(व्यवस्थापकीय कार्यों को करने के लिए) और ROLE_USER
(एक पंजीकृत उपयोगकर्ता के रूप में कार्य करने के लिए) से जुड़ा हो सकता है।
मेरे web.xml
में, यह निम्नानुसार कॉन्फ़िगर किया गया है।
<security-constraint>
<display-name>AdminConstraint</display-name>
<web-resource-collection>
<web-resource-name>ROLE_ADMIN</web-resource-name>
<description/>
<url-pattern>/admin_side/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>ROLE_ADMIN</role-name>
</auth-constraint>
<user-data-constraint>
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<display-name>UserConstraint</display-name>
<web-resource-collection>
<web-resource-name>ROLE_USER</web-resource-name>
<description/>
<url-pattern>/user_side/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>ROLE_USER</role-name>
</auth-constraint>
<user-data-constraint>
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<!--<auth-method>DIGEST</auth-method>-->
<auth-method>FORM</auth-method>
<realm-name>projectRealm</realm-name>
<form-login-config>
<form-login-page>/utility/Login.jsf</form-login-page>
<form-error-page>/utility/ErrorPage.jsf</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description/>
<role-name>ROLE_ADMIN</role-name>
</security-role>
<security-role>
<description/>
<role-name>ROLE_USER</role-name>
</security-role>
यह ठीक काम करता है।
दो URL प्रतिमानों /admin_side/*
और /user_side/*
रहे हैं। व्यवस्थापक के पास दो भूमिकाएं ROLE_ADMIN
और ROLE_USER
हैं।
जब व्यवस्थापक अधिकार ROLE_USER
का उपयोग करने में लॉग करता है, केवल/user_side/*
में स्थित संसाधनों एक्सेस किया जाना चाहिए। /admin_side/*
में स्थित संसाधनों को एक्सेस करने से मना कर दिया जाना चाहिए क्योंकि व्यवस्थापक एक पंजीकृत उपयोगकर्ता के रूप में लॉग इन है, न कि व्यवस्थापक के रूप में।
अब तक मेरे मामले में क्या होता है यह है कि जब व्यवस्थापक किसी भी प्राधिकरण का उपयोग करने में लॉग इन करता है, तो दोनों स्थानों में संसाधनों का उपयोग किया जा सकता है जो पूरी तरह से अवैध है। ऐसा इसलिए है क्योंकि सिस्टम उस विशेष उपयोगकर्ता के लिए दोनों अधिकारियों को ढूंढने में सक्षम है।
प्रत्येक उपयोगकर्ता अपने अधिकार/भूमिका के अनुसार किसी विशिष्ट स्थान पर संसाधनों का उपयोग कैसे करें?
प्रमाणीकरण फिल्टर:
@WebFilter(filterName = "SecurityCheck", urlPatterns = {"/jass/*"})
public final class SecurityCheck implements Filter
{
private FilterConfig filterConfig = null;
@Resource(mappedName="jms/destinationFactory")
private ConnectionFactory connectionFactory;
@Resource(mappedName="jms/destination")
private Queue queue;
@EJB
private final UserBeanLocal userService=null;
public SecurityCheck() {}
private void sendJMSMessageToDestination(String message) throws JMSException
{
Connection connection = null;
Session session = null;
try
{
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
TextMessage textMessage = session.createTextMessage();
textMessage.setText(message);
messageProducer.send(textMessage);
}
finally
{
if(session!=null){session.close();}
if(connection!=null){connection.close();}
}
}
private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException
{
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
httpServletRequest.login(httpServletRequest.getParameter("userName"), httpServletRequest.getParameter("password"));
}
private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException, JMSException
{
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
HttpServletResponse httpServletResponse=(HttpServletResponse)response;
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
if(httpServletRequest.isUserInRole("ROLE_USER"))
{
sendJMSMessageToDestination(httpServletRequest.getLocalName());
UserTable userTable = userService.setLastLogin(httpServletRequest.getParameter("userName"));
userTable.setPassword(null);
sessionMap.put("userName", userTable!=null?userTable.getFirstName():"Unknown");
sessionMap.put("user", userTable);
httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.sendRedirect("../user_side/Home.jsf");
}
else if(httpServletRequest.isUserInRole("ROLE_ADMIN"))
{
sendJMSMessageToDestination(httpServletRequest.getLocalName());
UserTable userTable = userService.setLastLogin(httpServletRequest.getParameter("userName"));
userTable.setPassword(null);
sessionMap.put("adminName", userTable!=null?userTable.getFirstName():"Unknown");
sessionMap.put("user", userTable);
httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.sendRedirect("../admin_side/Home.jsf");
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
try
{
doBeforeProcessing(request, response);
}
catch (Exception e)
{
HttpServletResponse httpServletResponse=(HttpServletResponse)response;
//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "Incorrect user name and/or password. Access denied."));
httpServletResponse.sendRedirect("../utility/Login.jsf");
return;
}
chain.doFilter(request, response);
try
{
doAfterProcessing(request, response);
}
catch (JMSException ex)
{
Logger.getLogger(SecurityCheck.class.getName()).log(Level.SEVERE, null, ex);
}
}
//The rest of the filter.
}
आप तो अपने आवेदन में अन्य चीजों को देखने की जरूरत है, तो कृपया मुझे बताएं।
आप एक पंजीकृत उपयोगकर्ता के रूप में व्यवस्थापक में कितनी लॉगिंग कर रहे हैं? यदि किसी विशेष उपयोगकर्ता के पास कई भूमिकाएं हैं, तो वास्तव में उनमें से केवल एक का उपयोग करके लॉगिन करने का कोई तरीका नहीं है। तो पूरा सवाल उलझन में है। – BalusC
यह एक फ़िल्टर है जो उपयोगकर्ताओं को प्रमाणित करता है। फ़िल्टर को यूआरएल पटर में मैप किया गया है - '/ jass/*' (गलती से टाइप किया गया, '/ jaas/* 'होना चाहिए था)। यह एक निर्देशिका इंगित करता है जिसमें केवल एक पृष्ठ है- 'temp.jsp' जहां अनुरोध भेजा जाता है, जब जेएसएफ पृष्ठ पर लॉगिन बटन दबाया जाता है (इसके संबंधित जेएसएफ प्रबंधित बीन के माध्यम से)। क्या व्यवस्थापक के रूप में एक बार लॉग इन करने का कोई तरीका नहीं है और एक बार उपयोगकर्ता के समान आईडी/पासवर्ड का उपयोग करने का कोई तरीका नहीं है? मुझे ऐसा भी लगा लेकिन सोचा कि कंटेनर ऐसा करने के लिए कुछ तंत्र का समर्थन कर सकता है। मैंने कुछ ट्यूटोरियल में देखा लेकिन इसके बारे में कुछ भी नहीं मिला। – Tiny