source: trunk/grails-app/services/dbnp/authentication/RemoteAuthenticationService.groovy @ 1939

Last change on this file since 1939 was 1939, checked in by robert@…, 7 years ago

Updated module notification so that it also sends authentication to modules.

File size: 3.6 KB
Line 
1/**
2 * RemoteAuthenticationService Service
3 *
4 * Description of my service
5 *
6 * @author  your email (+name?)
7 * @since       2010mmdd
8 * @package     ???
9 *
10 * Revision information:
11 * $Rev: 1430 $
12 * $Author: work@osx.eu $
13 * $Date: 2011-01-21 21:05:36 +0100 (Fri, 21 Jan 2011) $
14 */
15package dbnp.authentication
16
17import java.util.Date;
18
19class RemoteAuthenticationService implements Serializable {
20        static final int expiryTime = 12 * 60; // Number of minutes a remotely logged in user remains active
21
22        static transactional = false
23
24        /**
25         * Logs a user in for a remote session
26         */
27        public boolean logInRemotely( String consumer, String token, SecUser user, Integer seconds = null ) {
28                // Remove expired users, otherwise they will be kept in the database forever
29                removeExpiredTokens()
30
31                // Make sure there is no other logged in user anymore
32                logOffRemotely( consumer, token )
33
34                def SAUser = new SessionAuthenticatedUser( consumer: consumer, token: token, secUser: user, expiryDate: createExpiryDate( seconds ) )
35
36                return SAUser.save()
37        }
38
39        public boolean logOffRemotely( String consumer, String token ) {
40                def user = getSessionAuthenticatedUser(consumer, token)
41
42                if( user ) {
43                        user.refresh()
44                        user.delete()
45                }
46
47                return true
48        }
49
50        /**
51         * Checks whether a user is logged in from a remote consumer with the
52         * given token
53         */
54        public boolean isRemotelyLoggedIn( String consumer, String token ) {
55                // Check whether a user exists
56                def user = getSessionAuthenticatedUser(consumer, token)
57
58                // Check whether the user is logged in. Since we don't want to return a
59                // user, we explicitly return true or false
60                if( user ) {
61                        // The expiry date should be reset
62                        updateExpiryDate( user )
63
64                        return true
65                } else {
66                        return false
67                }
68        }
69
70        /**
71         * Returns the user that is logged in remotely
72         */
73        public SecUser getRemotelyLoggedInUser( String consumer, String token ) {
74                // Check whether a user exists
75                def user = getSessionAuthenticatedUser(consumer, token)
76
77                return user ? user.secUser : null
78        }
79
80        /**
81         * Remove all remote sessions for a user
82         * @param user
83         */
84        public void deleteRemoteSessions( SecUser user ) {
85                if( user ) {
86                        SessionAuthenticatedUser.executeUpdate("delete SessionAuthenticatedUser u where u.secUser = :secUser", [ secUser: user ])
87                }
88        }
89
90        /**
91         * Removes all tokens for remote logins that have expired
92         */
93        protected boolean removeExpiredTokens() {
94                SessionAuthenticatedUser.executeUpdate("delete SessionAuthenticatedUser u where u.expiryDate < :expiryDate", [ expiryDate: new Date() ])
95        }
96
97        /**
98         * Returns the currently logged in user from the database or null if no user is logged in
99         */
100        protected SessionAuthenticatedUser getSessionAuthenticatedUser( String consumer, String token ) {
101                def c = SessionAuthenticatedUser.createCriteria()
102                def result = c.get {
103                        and {
104                                eq( "consumer", consumer)
105                                eq( "token", token)
106                                gt( "expiryDate", new Date())
107                        }
108                }
109
110                if( result )
111                        return result
112                else
113                        return null
114        }
115
116        /**
117         * Returns the expiry date for a user that is active now.
118         */
119        protected Date createExpiryDate( Integer seconds = null) {
120                // Compute expiryDate
121                long now = new Date().getTime();
122
123                if( seconds == null )
124                        seconds = RemoteAuthenticationService.expiryTime * 60
125
126                return new Date( now + seconds * 1000 );
127
128        }
129
130        /**
131         * Resets the expiry date of the given user. This should be called every time
132         * an action occurs with this user. That way, if (in case of a timeout of 60 minutes)
133         * he logs in and returns 50 minutes later, he will keep a timeout value of
134         * 60 minutes, instead of only 10 minutes.
135         */
136        protected boolean updateExpiryDate( SessionAuthenticatedUser user ) {
137                user.expiryDate = createExpiryDate()
138                return user.save()
139        }
140
141}
Note: See TracBrowser for help on using the repository browser.