Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sample_app
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Mai Hoang Thai Ha
sample_app
Commits
37623935
Commit
37623935
authored
Jun 11, 2021
by
Mai Hoang Thai Ha
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement advanced login
parent
33064d7a
Pipeline
#1264
failed with stages
in 0 seconds
Changes
11
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
106 additions
and
5 deletions
+106
-5
app/assets/stylesheets/custom.scss
+14
-0
app/controllers/sessions_controller.rb
+2
-1
app/controllers/users_controller.rb
+1
-0
app/helpers/sessions_helper.rb
+23
-3
app/models/user.rb
+24
-0
app/views/sessions/new.html.erb
+5
-0
db/migrate/20210611030107_add_remember_digest_to_users.rb
+5
-0
db/schema.rb
+2
-1
test/integration/users_login_test.rb
+12
-0
test/models/user_test.rb
+4
-0
test/test_helper.rb
+14
-0
No files found.
app/assets/stylesheets/custom.scss
View file @
37623935
...
...
@@ -180,6 +180,20 @@ input {
}
}
.checkbox
{
margin-top
:
-10px
;
margin-bottom
:
10px
;
span
{
margin-left
:
20px
;
font-weight
:
normal
;
}
}
#session_remember_me
{
width
:
auto
;
margin-left
:
0
;
}
@media
(
max-width
:
800px
)
{
footer
{
small
{
...
...
app/controllers/sessions_controller.rb
View file @
37623935
...
...
@@ -6,6 +6,7 @@ class SessionsController < ApplicationController
user
=
User
.
find_by
(
email:
params
[
:session
][
:email
].
downcase
)
if
user
&&
user
.
authenticate
(
params
[
:session
][
:password
])
log_in
user
params
[
:session
][
:remember_me
]
==
'1'
?
remember
(
user
)
:
forget
(
user
)
redirect_to
user
else
flash
.
now
[
:danger
]
=
'Invalid email/password combination'
...
...
@@ -14,7 +15,7 @@ class SessionsController < ApplicationController
end
def
destroy
log_out
log_out
if
logged_in?
redirect_to
root_url
end
end
app/controllers/users_controller.rb
View file @
37623935
...
...
@@ -12,6 +12,7 @@ class UsersController < ApplicationController
@user
=
User
.
new
(
user_params
)
if
@user
.
save
log_in
@user
remember
@user
flash
[
:success
]
=
"Welcome to the Sample App!"
redirect_to
@user
else
...
...
app/helpers/sessions_helper.rb
View file @
37623935
...
...
@@ -5,10 +5,23 @@ module SessionsHelper
session
[
:user_id
]
=
user
.
id
end
def
remember
(
user
)
user
.
remember
cookies
.
permanent
.
encrypted
[
:user_id
]
=
user
.
id
cookies
.
permanent
[
:remember_token
]
=
user
.
remember_token
end
# Return the curent lofed-in user (if any)
def
current_user
if
session
[
:user_id
]
@current_user
||=
User
.
find_by
(
id:
session
[
:user_id
])
if
(
user_id
=
session
[
:user_id
])
@current_user
||=
User
.
find_by
(
id:
user_id
)
elsif
(
user_id
=
cookies
.
encrypted
[
:user_id
])
raise
# The tests still pass, so this branch is currently untested.
user
=
User
.
find_by
(
id:
user_id
)
if
user
&&
user
.
authenticated?
(
cookies
[
:remember_token
])
log_in
user
@current_user
=
user
end
end
end
...
...
@@ -17,8 +30,15 @@ module SessionsHelper
!
current_user
.
nil?
end
def
forget
(
user
)
user
.
forget
cookies
.
delete
(
:user_id
)
cookies
.
delete
(
:remember_token
)
end
def
log_out
forget
(
current_user
)
session
.
delete
(
:user_id
)
@current_user
=
nil
end
end
end
app/models/user.rb
View file @
37623935
class
User
<
ApplicationRecord
attr_accessor
:remember_token
before_save
{
self
.
email
=
email
.
downcase
}
validates
:name
,
presence:
true
,
length:
{
maximum
:
50
}
VALID_EMAIL_REGEX
=
/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
...
...
@@ -14,4 +15,26 @@ class User < ApplicationRecord
BCrypt
::
Engine
.
cost
BCrypt
::
Password
.
create
(
string
,
cost:
cost
)
end
# Return a random token
def
User
.
new_token
SecureRandom
.
urlsafe_base64
end
# Remember a user in the database for use in persistent sessions
def
remember
self
.
remember_token
=
User
.
new_token
update_attribute
(
:remember_digest
,
User
.
digest
(
remember_token
))
end
# Return true if the given token matches the digest
def
authenticated?
(
remember_token
)
return
false
if
remember_digest
.
nil?
BCrypt
::
Password
.
new
(
remember_digest
).
is_password?
(
remember_token
)
end
# Forgets a user
def
forget
update_attribute
(
:remember_digest
,
nil
)
end
end
\ No newline at end of file
app/views/sessions/new.html.erb
View file @
37623935
...
...
@@ -10,6 +10,11 @@
<%=
f
.
label
:password
%>
<%=
f
.
password_field
:password
,
class:
'form-control'
%>
<%=
f
.
label
:remember_me
,
class:
"checkbox inline"
do
%>
<%=
f
.
check_box
:remember_me
%>
<span>
Remember me on this computer
</span>
<%
end
%>
<%=
f
.
submit
"Log in"
,
class:
"btn btn-primary"
%>
<%
end
%>
...
...
db/migrate/20210611030107_add_remember_digest_to_users.rb
0 → 100644
View file @
37623935
class
AddRememberDigestToUsers
<
ActiveRecord
::
Migration
[
6.1
]
def
change
add_column
:users
,
:remember_digest
,
:string
end
end
db/schema.rb
View file @
37623935
...
...
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
2021_06_
07_081815
)
do
ActiveRecord
::
Schema
.
define
(
version:
2021_06_
11_030107
)
do
create_table
"users"
,
force: :cascade
do
|
t
|
t
.
string
"name"
...
...
@@ -18,6 +18,7 @@ ActiveRecord::Schema.define(version: 2021_06_07_081815) do
t
.
datetime
"created_at"
,
precision:
6
,
null:
false
t
.
datetime
"updated_at"
,
precision:
6
,
null:
false
t
.
string
"password_digest"
t
.
string
"remember_digest"
t
.
index
[
"email"
],
name:
"index_users_on_email"
,
unique:
true
end
...
...
test/integration/users_login_test.rb
View file @
37623935
...
...
@@ -32,9 +32,21 @@ class UsersLoginTest < ActionDispatch::IntegrationTest
delete
logout_path
assert_not
is_logged_in?
assert_redirected_to
root_url
delete
logout_path
follow_redirect!
assert_select
"a[href=?]"
,
login_path
assert_select
"a[href=?]"
,
logout_path
,
count:
0
assert_select
"a[href=?]"
,
user_path
(
@user
),
count:
0
end
test
"login with remembering"
do
log_in_as
(
@user
,
remember_me:
'1'
)
assert_not_empty
cookies
[
:remember_token
]
end
test
"login without remembering"
do
log_in_as
(
@user
,
remember_me:
'1'
)
log_in_as
(
@user
,
remember_me:
'0'
)
assert_empty
cookies
[
:remember_token
]
end
end
test/models/user_test.rb
View file @
37623935
...
...
@@ -54,4 +54,8 @@ class UserTest < ActiveSupport::TestCase
@user
.
password
=
@user
.
password_confirmation
=
"a"
*
5
assert_not
@user
.
valid?
end
test
"authenticated? should return false for a user with nil digest"
do
assert_not
@user
.
authenticated?
(
''
)
end
end
test/test_helper.rb
View file @
37623935
...
...
@@ -15,4 +15,17 @@ class ActiveSupport::TestCase
def
is_logged_in?
!
session
[
:user_id
].
nil?
end
def
Log_in_as
(
user
)
session
[
:user_id
]
=
user
.
id
end
end
class
ActionDispatch
::
IntegrationTest
def
log_in_as
(
user
,
password:
'password'
,
remember_me:
'1'
)
post
login_path
,
params:
{
session:
{
email:
user
.
email
,
password:
password
,
remember_me:
remember_me
}
}
end
end
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment