1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.frontend.servlets;
20
21 import java.security.Principal;
22 import java.util.Optional;
23
24 import org.apache.logging.log4j.LogManager;
25 import org.apache.logging.log4j.Logger;
26 import org.mycore.common.MCRSession;
27 import org.mycore.common.MCRSessionMgr;
28 import org.mycore.common.MCRSystemUserInformation;
29 import org.mycore.common.MCRUserInformation;
30 import org.mycore.frontend.MCRFrontendUtil;
31
32 import jakarta.servlet.http.HttpServletRequest;
33
34
35
36
37
38 public class MCRContainerLoginServlet extends MCRServlet {
39
40 private static final long serialVersionUID = 1L;
41
42 private static final Logger LOGGER = LogManager.getLogger(MCRContainerLoginServlet.class);
43
44
45
46
47 @Override
48 protected void think(MCRServletJob job) throws Exception {
49 MCRSession session = MCRSessionMgr.getCurrentSession();
50 session.setUserInformation(new ContainerUserInformation(session));
51 LOGGER.info("Logged in: {}", session.getUserInformation().getUserID());
52 }
53
54
55
56
57 @Override
58 protected void render(MCRServletJob job, Exception ex) throws Exception {
59 String backToUrl = getProperty(job.getRequest(), "url");
60
61 if (backToUrl == null) {
62 String referer = job.getRequest().getHeader("Referer");
63 backToUrl = (referer != null) ? referer : MCRFrontendUtil.getBaseURL();
64 }
65 job.getResponse().sendRedirect(job.getResponse().encodeRedirectURL(backToUrl));
66 }
67
68 protected static class ContainerUserInformation implements MCRUserInformation {
69 protected MCRSession session;
70
71 String lastUser;
72
73 public ContainerUserInformation(MCRSession session) {
74 this.session = session;
75 }
76
77 @Override
78 public String getUserID() {
79 lastUser = getCurrentRequest()
80 .flatMap(r -> Optional.ofNullable(r.getUserPrincipal()))
81 .map(Principal::getName)
82 .orElseGet(() -> Optional.ofNullable(lastUser)
83 .orElseGet(MCRSystemUserInformation.getGuestInstance()::getUserID));
84 return lastUser;
85 }
86
87 @Override
88 public boolean isUserInRole(String role) {
89 return getCurrentRequest().map(r -> r.isUserInRole(role)).orElse(Boolean.FALSE);
90 }
91
92 @Override
93 public String getUserAttribute(String attribute) {
94 return null;
95 }
96
97 protected Optional<HttpServletRequest> getCurrentRequest() {
98 LogManager.getLogger(getClass()).debug("Getting request from session: {}", session.getID());
99 return MCRFrontendUtil.getCurrentServletJob()
100 .map(MCRServletJob::getRequest);
101 }
102 }
103
104 }