Minor correction. findOne in the code below should be getSingleResult().
Forgot I'd changed it...
Charles F. Munat wrote:
> This depends on HTTP_REFERER being set. It usually is, but there's no
> guarantee. Another way I've found is to set a SessionVar in the
> addDispatchBefore (or wherever you're redirecting to the login page).
>
> Here's what I'm doing (suggestions for improvement most welcome):
>
> (Member is the user model. There are booleans for isDeveloper and
> isAdministrator, plus an enum for the various types of Member. Then I
> call isDeveloper_?, isAdministrator_?, or isMember_?(<list of types>) in
> the SiteMap.)
>
> I'll be adding a Role feature soon, where specific methods will have
> rights (e.g. view.categories, update.members) associated with them,
> Members will have Roles and Roles will have Rights and a simple test on
> the method will determine how the method proceeds.
>
> In boot:
>
> // Keeps folks who ain't logged in out of the admin directory
> LiftRules.addDispatchBefore {
> case RequestState("admin" :: page , "", _)
> if !AccessControl.isAuthenticated_? =>
> S.error("Please log in to view the page you requested.")
> RequestedURL(Full(S.uri))
> () => Full(RedirectResponse("/login"))
> }
>
> Elsewhere:
>
> object CurrentUserId extends SessionVar[Can[Long]](Empty)
> object RequestedURL extends SessionVar[Can[String]](Empty)
> object CurrentUser extends RequestVar[Can[Member]](Empty)
>
> object AccessControl {
>
> // Log the user in
> def login(): Can[LiftResponse] = {
> if (S.post_?) {
> try {
> val member: Member =
> Model.createNamedQuery[Member]("findMemberByEmailAddress",
> "emailAddress" -> S.param("emailAddress").openOr("")).findOne
>
> if (member.authenticate(S.param("password").openOr(""))) {
> CurrentUser(Full(member))
> CurrentUserId(Full(member.id))
> }
> else
> S.error("Unable to log you in. Please check your " +
> "email address and password and try again.")
>
> } catch {
> case x: NoResultException =>
> S.error("Unable to log you in. Please check your " +
> "email address and password and try again.")
> case _ => S.error("Oooh, that's gotta hurt.")
> }
> }
>
> val uri = RequestedURL.openOr("/")
> RequestedURL(Empty)
> Full(RedirectResponse(uri))
> }
>
> // Log the user out
> def logout(): Can[LiftResponse] = {
> CurrentUser(Empty)
> CurrentUserId(Empty)
> Full(RedirectResponse(S.param("path").openOr("/")))
> }
>
> // Is there a logged-in user?
> def isAuthenticated_?() =
> CurrentUserId.is.map((Long) => true) openOr false
>
> // Is this user a developer?
> def isDeveloper_?() : Boolean = {
> CurrentUser.is match {
> case Empty => CurrentUserId.is match {
> case Empty => false
> case Full(id) => Model.find(classOf[Member], id) match {
> case null => false
> case m => CurrentUser(Full(m))
> m.isDeveloper
> }
> }
> case Full(m) => m.isDeveloper
> }
> }
>
> // Is this user an administrator?
> def isAdministrator_?() : Boolean = {
> isDeveloper_? || (CurrentUser.is match {
> case Empty => CurrentUserId.is match {
> case Empty => false
> case Full(id) => Model.find(classOf[Member], id) match {
> case null => false
> case m => CurrentUser(Full(m))
> m.isAdministrator
> }
> }
> case Full(m) => m.isAdministrator
> })
> }
>
> // Allow isMember_? with a string
> def isMember_?(mtype: String)() : Boolean = isMember_?(List(mtype))()
>
> // Takes a list of member types and determines if this member
> // is one of them
> def isMember_?(mtypes: List[String])() : Boolean = {
> isAdministrator_? || (
> CurrentUser.is match {
> case Empty => CurrentUserId.is match {
> case Empty => false
> case Full(id) => Model.find(classOf[Member], id) match {
> case null => false
> case m => CurrentUser(Full(m))
> mtypes.filter(
> _.compareToIgnoreCase(m.memberGroup.toString) == 0
> ).size > 0
> }
> }
> case Full(m) =>
> mtypes.filter(
> _.compareToIgnoreCase(m.memberGroup.toString) == 0
> ).size > 0
> }
> )
> }
> }
>
> Chas.
>
>
> David Pollak wrote:
>> object Login {
>> def login() = {
>> val from = S.referer.openOr("/")
>>
>> User.currentUser match {
>> case Full(_) => // do nothing
>> case _ =>
>> def testPwd(user: User, pwd: String): Can[Boolean] =
>> if (user.password.match_?(pwd)) {
>> if (user.invalid_?) Failure(user.invalidReason, Empty, Nil)
>> else {User.logUserIn(user); Full(true)}
>>
>> //Full(true)
>> } else Failure("Password mis-match", Empty, Nil)
>>
>> (for (email <- S.param("username") ?~ "No Username";
>> pwd <- S.param("password") ?~ "No Password";
>> user <- User.find(By(User.email, email)) ?~ "User Not Found";
>> success <- testPwd(user, pwd)) yield {
>> user
>> }) match {
>> case Full(user) => S.notice("Welcome: "+user.niceName)
>> if (!user.validated) {
>> S.notice("Until your registration is confirmed, you cannot
>> edit pages in the wiki")
>> }
>> case Failure(msg, _, _) => S.error(msg)
>> case _ => S.error("Not logged In")
>> }
>> }
>>
>> Full(RedirectResponse(from))
>> }
>>
>> def logout() = {
>> val from = S.referer.openOr("/")
>>
>> User.logoutCurrentUser
>> S.notice("Logged Out")
>>
>> Full(RedirectResponse(from))
>> }
>> }
>>
>>
>> On Tue, Oct 21, 2008 at 2:05 PM, Derek Chen-Becker
>> <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
>>
>> A followup question. If I want to redirect back to the original page
>> that prompted the login redirect, how would I get that? I know I can
>> get use S.uri to get everything but the query string, but do I need
>> to dig deeper into the actual HttpServletRequest to get at
>> everything after the host portion?
>>
>> Thanks,
>>
>> Derek
>>
>>
>> On Tue, Oct 21, 2008 at 2:21 PM, Derek Chen-Becker
>> <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
>>
>> OK, that makes sense. Sometimes when you have a hammer
>> everything looks like a nail :)
>>
>>
>> On Tue, Oct 21, 2008 at 2:05 PM, David Pollak
>> <[EMAIL PROTECTED]
>> <mailto:[EMAIL PROTECTED]>> wrote:
>>
>> SessionVars are not available during URL rewriting. URL
>> rewriting takes place before the session is obtained. This
>> is deliberate because the URL rewriting takes place before
>> the sessionless dispatch is consulted. This happens before
>> the session is retrieved/created and the regular flow happens.
>>
>> Access control on an HTML page level should be done in SiteMap.
>>
>>
>> On Tue, Oct 21, 2008 at 1:00 PM, Derek Chen-Becker
>> <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
>>
>> I could have sworn this had been covered recently on the
>> list but I can't seem to find it. I'd like to have a
>> rewrite function that checks to see if someone is logged
>> in and in the proper role before allowing them to get to
>> the page. I had wanted to do this using
>> LiftRules.addRewriteBefore combined with two SessionVars
>> that would hold the user name and their roles (if logged
>> in). Unfortunately, it looks like SessionVars don't seem
>> to be usable inside the rewrite function because the
>> LiftSession hasn't been set up yet at that point. I'm I
>> missing something obvious, or does anyone have some
>> suggestions for doing it in a different/better way?
>>
>> Thanks,
>>
>> Derek
>>
>>
>>
>>
>>
>> --
>> Lift, the simply functional web framework http://liftweb.net
>> Collaborative Task Management http://much4.us
>> Follow me: http://twitter.com/dpp
>> Git some: http://github.com/dpp
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> --
>> Lift, the simply functional web framework http://liftweb.net
>> Collaborative Task Management http://much4.us
>> Follow me: http://twitter.com/dpp
>> Git some: http://github.com/dpp
>>
>
> >
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Lift" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---