Java & Java EE 3o Μέρος: Διασφάλιση ασφάλειας σε εφαρμογές Java Enterprise Edition Κακαρόντζας Γεώργιος
Μεθοδολογία Θα υλοποιήσουμε την λεγόμενη πιστοποίηση μέσω φόρμας στοιχείων εισόδου (form-based authentication) Γι' αυτό θα χρειαστούμε τρία βήματα: Υλοποίηση της σελίδας εισόδου των στοιχείων Υλοποίηση της σελίδας λάθους σύνδεσης στην οποία θα κατευθύνεται ο χρήστης όταν δεν δίνει το σωστό όνομα χρήστη και τον σωστό κωδικό. Ρύθμιση της εφαρμογής ώστε να χρησιμοποιεί για πιστοποίηση κάποια συγκεκριμένη περιοχή ασφάλειας (security realm).
Υλοποίηση της σελίδας εισόδου των στοιχείων login.jsp <%@page contenttype="text/html" pageencoding="utf-8"%> <!DOCTYPE html> <html> Η σελίδα login.jsp θα χρησιμοποιηθεί για την σύνδεση των χρηστών. Παρατηρείστε πως τον χειρισμό της φόρμας κάνει το servlet j_security_chek το οποίο δεν θα γράψουμε εμείς (παρέχεται από την πλατφόρμα). <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <td align="right">κωδικός: </td> <td> <title>σελίδα Σύνδεσης</title> <input type="password" name="j_password"> </head> </td> <body> <p> </tr> <h1>σύνδεση</h1> <tr> </p> <td></td> <form method="post" action="j_security_check"> <td> <table cellpadding="0" cellspacing="0" border="0"> <input type="submit" value="σύνδεση"></td> <tr> </tr> <td align="right">όνομα Χρήστη: </td> <td> <input type="text" name="j_username"> </td> </tr> </table> </form> </body> </html>
Υλοποίηση της σελίδας Υλοποίηση της σελίδας λάθους σύνδεσης login_error.jsp <%@page contenttype="text/html" pageencoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>jsp Page</title> </head> <body> <h1>αποτυχία Σύνδεσης</h1> <a href="login.jsp"> Παρακαλώ δοκιμάστε ξανά. </a> </body> </html> Η σελίδα login_eror.jsp θα χρησιμοποιηθεί για την εμφάνιση μηνύματος λάθους σε περίπτωση αποτυχίας σύνδεσης. Η σελίδα παρέχει σύνδεσμο προς τη σελίδα σύνδεσης. Εναλλακτικά (και προτιμότερο) θα ήταν να είχαμε ξανά τη φόρμα σύνδεσης σε αυτή τη σελίδα.
Δημιουργία του web.xml Για τη ρύθμιση ασφάλειας της εφαρμογής είναι απαραίτητο να δημιουργήσουμε το αρχείο web.xml Στις παλαιότερες εκδόσεις της JEE αυτό το αρχείο ήταν πολύ σημαντικό. Στις τελευταίες εκδόσεις με τη χρήση των annotations (@) δεν είναι τόσο σημαντικό. Παρόλα αυτά απαιτείται ακόμη για τη ρύθμιση της ασφάλειας. Για την δημιουργία του αρχείου web.xml της εφαρμογής επιλέγετε File->Νew File... και από την κατηγορία Web επιλέγετε Standard Deployment Descriptor (web.xml) και πατάτε το πλήκτρο Next και μετά το Finish.
Ρυθμίσεις Σύνδεσης Για τη ρύθμιση ασφαλείας στο ανοιχτό για επεξεργασία web.xml μεταβαίνουμε στη καρτέλα Security. Αρχικά στο τμήμα Login Configuration προσδιορίζουμε πως θέλουμε Form-based πιστοποίηση, τις σελίδες σύνδεσης (/login.jsp) και λάθους σύνδεσης (/login_error.jsp), καθώς και το όνομα της περιοχής πιστοποίησης (Realm Name). Στο παράδειγμά μας θα ονομάσουμε το Realm file και αργότερα θα κάνουμε την απαραίτητη δημιουργία του στον εξυπηρετητή της εφαρμογής.
Προσθήκη Ρόλων Ασφάλειας Ένας ρόλος ασφάλειας (security role) είναι μια ομάδα χρηστών με διακριτές εξουσιοδοτήσεις. Για παράδειγμα οι χρήστες κάποιου ρόλου ενδέχεται να μπορούν να δουν μια σελίδα που οι χρήστες ενός άλλου ρόλου δεν μπορούν. Στην εφαρμογή μας θα χρειαστούμε δύο ρόλους. Τον ρόλο 'administrators' που αφορά την 'Ομάδα Διαχειριστών' και τον ρόλο 'users' που αφορά την 'Ομάδα Χρηστών'. Στο τμήμα 'Security Roles' πατάμε δύο φορές το Add... για να προσθέσουμε τους δύο ρόλους με τα ονόματα και τις περιγραφές τους (όπως δείχνει η εικόνα).
Προσθήκη Περιορισμών Ασφάλειας (1) Για τους ρόλους που ορίσαμε δημιουργούμε περιορισμούς ασφάλειας που προσδιορίζουν τι μπορεί να προσπελάσει ο κάθε ρόλος και με ποιον τρόπο. Για να ορίσουμε έναν περιορισμό ασφαλείας πατάμε το πλήκτρο Add Security Constraint και αρχικά του αποδίδουμε ένα όνομα (π.χ. Administrator Pages) όπως δείχνει η εικόνα.
Προσθήκη Περιορισμών Ασφάλειας (2) Στην συνέχεια κάνουμε κλικ στο πλήκτρο Add... κάτω από το Web Resource Collection για να καθορίσουμε ποια ή ποιες περιοχές του site μπορεί να προσπελάσει ο ρόλος και με ποιο τρόπο. Για παράδειγμα ο περιορισμός /admin/* σημαίνει όλες οι σελίδες κάτω από τον φάκελο admin.
Προσθήκη Περιορισμών Ασφάλειας (3) Για το Web Resource Collection που ορίσαμε προηγουμένως θα πρέπει να ενεργοποιήσουμε τον περιορισμό ασφαλείας επιλέγοντας το πλαίσιο ελέγχου Enable Security Constraint και να προσδιορίσουμε πως αφορά τον ρόλο 'administrators' όπως δείχνει η πάνω Εικόνα. Ο ρόλος επιλέγεται από τους δηλωθέντες ήδη ρόλους όπως φαίνεται στην κάτω Εικόνα. Αυτό το πλαίσιο διαλόγου εμφανίζεται κάνοντας κλικ στο πλήκτρο 'Edit' στο 'Role Name(s)'. Μπορείτε να επιλέξετε πολλούς ρόλους που έχουν πρόσβαση σε μία ή περισσότερες περιοχές.
Δημιουργία σελίδας διαχειριστή Δημιουργήστε έναν υπο-φάκελο του Web Pages με το όνομα admin κάνοντας δεξί κλικ στον φάκελο Web Pages και επιλέγοντας από το αναδυόμενο μενού New-->Other... και από την κατηγορία Other το Folder και δίνοντας όνομα admin. Στην συνέχεια με δεξί κλικ στον νεοδημιούργητο φάκελο admin επιλέξτε το New και στη συνέχεια HTML και δώστε το όνομα admin.html. Εισάγεται μία τυπική σελίδα που φαίνεται στο πλαίσιο απλά για να δοκιμάσουμε τη δυνατότητα σύνδεσης. <!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body> <div>σελίδα Διαχειριστή</div> </body> </html>
Δημιουργία του περιγραφέα του Glassfish application server Τα βήματα που είδαμε ως τώρα γίνονται ανεξάρτητα από τον εξυπηρετητή. Ο εξυπηρετητής όμως θα κάνει την πιστοποίηση και την εξουσιοδότηση οπότε απαιτούνται και κάποια πρόσθετα βήματα ρύθμισης που εξαρτώνται από τον εξυπηρετητή. Για τον Glassfish που είναι ο εξ ορισμού εξυπηρετητής στο NetBeans επιλέγουμε File --> New File... και από την κατηγορία Glassfish επιλέγουμε Glassfish Descriptor
Αντιστοιχίσεις Ρόλων Ασφαλείας Οι ρόλοι ασφαλείας πρέπει να αντιστοιχιστούν σε ομάδες του εξυπηρετητή στο αρχείο glassfish-web.xml. Πηγαίνετε στην καρτέλα Security του επεξεργαστή αυτού του αρχείου και για το ρόλο Administrators ορίζεται την ομάδα admins πατώντας το πλήκτρο Add Group Η ομάδα αυτή στη συνέχεια θα οριστεί στον εξυπηρετητή.
Πρόσβαση στην κονσόλα διαχείρισης του εξυπηρετητή Για το επόμενο βήμα πρέπει να κάνουμε κλικ στην καρτέλα Services. Εκεί από την επιλογή Servers θα δούμε το εικονίδιο του Glassfish Server 4.0. Με δεξί κλικ σ' αυτό το εικονίδιο θα επιλέξουμε View Domain Admin Console Αυτό θα μας πάει στην κονσόλα διαχείρισης του Glassfish στον browser (ενδέχεται να χρειαστεί login αν έχετε δώσει password διαχειριστή).
Στην κονσόλα διαχείρισης του Glassfish επεκτείνουμε τον κόμβο Configurations και μετά server-config και μετά Security και μετά Realms και εκεί κάνουμε κλικ στο προκαθορισμένο ήδη realm file.
Προσθήκη χρηστών σε ομάδες Για το realm file κάνουμε κλικ στο πλήκτρο Manage Users και στο παράθυρο που θα εμφανισθεί δηλώνουμε έναν νέο χρήστη κάνοντας κλικ στο New. Δίνουμε τα απαραίτητα στοιχεία. User id (π.χ. george) Group List (π.χ. admins). Αυτή είναι η ομάδα ή ομάδες που ανήκει ο χρήστης. Πρέπει να αντιστοιχεί στην ομάδα που ορίστηκε στο glassfish-web.xml Password και Confirm Password : ο κωδικός του χρήστη (π.χ. cangetin). Μετά από αυτό το βήμα έχουμε ένα χρήστη και μπορούμε να δοκιμάσουμε την εφαρμογή.
Δοκιμή της ασφάλειας Κάνοντας δεξί κλικ στην ιστοσελίδα admin.html στον φάκελο admin και επιλέγοντας Run File θα εμφανισθεί η σελίδα σύνδεσης αντί της σελίδας admin.html. Μόνο αν δώσουμε τα σωστά στοιχεία του διαχειριστή που ορίσαμε στο file realm (george με κωδικό cangetin) θα μας αφήσει να δούμε τη σελίδα. Διαφορετικά θα δούμε τη σελίδα λάθους σύνδεσης.
Ερωτήσεις;