aboutsummaryrefslogtreecommitdiff
path: root/juick-server/src/main/java/com/juick/server
diff options
context:
space:
mode:
authorGravatar Alexander Alexeev2017-04-05 17:36:38 +0700
committerGravatar Vitaly Takmazov2017-04-05 14:02:56 +0300
commita9a2c587a4de11ce04aaae7a0c1a5dab1430794a (patch)
treebd86b40c1fefc10b3fa30d370ce0cdee5ba4ee06 /juick-server/src/main/java/com/juick/server
parent4c99585f95cda1839f364524b6f68a16d063ed61 (diff)
login by hash, remember-me
Diffstat (limited to 'juick-server/src/main/java/com/juick/server')
-rw-r--r--juick-server/src/main/java/com/juick/server/security/HashParamAuthenticationFilter.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/juick-server/src/main/java/com/juick/server/security/HashParamAuthenticationFilter.java b/juick-server/src/main/java/com/juick/server/security/HashParamAuthenticationFilter.java
new file mode 100644
index 00000000..df1ae38c
--- /dev/null
+++ b/juick-server/src/main/java/com/juick/server/security/HashParamAuthenticationFilter.java
@@ -0,0 +1,66 @@
+package com.juick.server.security;
+
+import com.juick.User;
+import com.juick.server.security.entities.JuickUser;
+import com.juick.service.UserService;
+import org.springframework.security.authentication.AnonymousAuthenticationToken;
+import org.springframework.security.authentication.RememberMeAuthenticationToken;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * Created by aalexeev on 4/5/17.
+ */
+public class HashParamAuthenticationFilter extends OncePerRequestFilter {
+ public static final String PARAM_NAME = "hash";
+
+ private final UserService userService;
+
+
+ public HashParamAuthenticationFilter(UserService userService) {
+ this.userService = userService;
+ }
+
+ @Override
+ protected void doFilterInternal(
+ HttpServletRequest request,
+ HttpServletResponse response,
+ FilterChain filterChain) throws ServletException, IOException {
+
+ String hash = request.getHeader(PARAM_NAME);
+
+ if (hash == null)
+ hash = request.getParameter(PARAM_NAME);
+
+ if (hash != null && authenticationIsRequired()) {
+ User user = userService.getUserByHash(hash);
+
+ if (!user.isAnonymous())
+ SecurityContextHolder.getContext().setAuthentication(
+ new RememberMeAuthenticationToken(hash, new JuickUser(user), JuickUser.USER_AUTHORITY));
+ }
+
+ filterChain.doFilter(request, response);
+ }
+
+ private boolean authenticationIsRequired() {
+ Authentication existingAuth = SecurityContextHolder.getContext().getAuthentication();
+
+ if (existingAuth == null || !existingAuth.isAuthenticated())
+ return true;
+
+ if (existingAuth instanceof AnonymousAuthenticationToken)
+ return true;
+
+ return false;
+ }
+}