Everything looks set up correctly now, I have an IniWebEnvironment in my servletContext inside the request handler... but now I get the following exception: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
This is a bit awkward, as I can indeed fetch the WebEnvironment through WebUtils.getRequiredWebEnvironment(request.getServletContext()), and it contains an instance of DefaultWebSecurityManager. I could set it manually with SecurityUtils.setSecurityManager, but as far as I know by now this would load the SecurityManager in VM context, which is probably not what I want. I don't really understand what is happening here. thank you. Am Fr., 13. Mai 2022 um 12:21 Uhr schrieb Josef Gosch <josef.go...@gmail.com >: > Hi. > Thanks for the hints. > I think my first approach wasn't too wrong, but it's still something > missing there... I set up a ServletContextHandler and configured it > according to the web.xml file in the example, and I let my RequestHandler > extend HandlerWrapper instead of AbstractHandler (don't really know if > tthat's the right approach...): > > /* handlers */ > ServletContextHandler context = new ServletContextHandler(); > context.setInitParameter("shiroConfigLocations", "classpath:shiro.ini"); > context.addEventListener(new EnvironmentLoaderListener()); > context.addFilter(ShiroFilter.class, "/*", EnumSet.of(REQUEST, FORWARD, > INCLUDE, ERROR, ASYNC)); > > GzipHandler gzip = new GzipHandler(); > gzip.setIncludedMimeTypes("text/html", "text/plain", "application/json"); > > RequestHandler requestHandler = new RequestHandler(this.gson, this.tractDB); > > context.insertHandler(requestHandler); > context.setGzipHandler(gzip); > > this.server.setHandler(context); > > But it seems to work now ---- What i found was that I initialized the > shiro.ini file in the main method. I somehow missed that, banging my head > at the table right now :). > > thank you. > > Am Fr., 13. Mai 2022 um 07:53 Uhr schrieb Benjamin Marwell < > bmarw...@apache.org>: > >> Hi! >> >> I think you need to init an environment and make it available >> throughout all of the requests. >> Look at this section: >> https://shiro.apache.org/web.html#shiro_1_2_and_later >> Especially the part "what it does": "(... including the >> SecurityManager) and makes it accessible in the ServletContext. >> >> You can take a look at the class >> "org.apache.shiro.web.env.EnvironmentLoaderListener" to see what it >> looks like. >> >> Once set up, you should be able to access your WebSecurityManager in >> any way you described. >> >> Am Fr., 13. Mai 2022 um 06:20 Uhr schrieb Lenny Primak < >> lpri...@hope.nyc.ny.us>: >> > >> > Have you looked at the Shiro web tutorial? >> > The examples there should work just fine. >> > >> > >> > On May 12, 2022, at 8:28 PM, Josef Gosch <josef.go...@gmail.com> wrote: >> > >> > My authentication realm is set up correctly, I can authenticate through >> an endpoint inside the RequestHandler. I can save the session cookie >> manually, but I can't find a way for the SecurityManager or >> WebSessionManager to intercept it. >> > >> > Josef Gosch <josef.go...@gmail.com> schrieb am Fr., 13. Mai 2022, >> 03:01: >> >> >> >> Hello. >> >> >> >> I have some troubles implementing Shiro in a distributed environment. >> >> Clients/Server are communicating through a HTTP based Protocol >> provided by Jetty on the server side. The client side is set up to store >> and reply cookies. >> >> >> >> I played around with different approaches but nothing seems to fit. I >> tried creating a ServletContextHandler and adding the Filters there, but I >> have no clue how to combine it with my RequestHandler. I also don't find >> much help online on this subject. Maybe someone here could give me a hint? >> >> >> >> It's basically made up of 2 Classes: >> >> >> >> public final class WebServer extends AbstractIdleService { >> >> >> >> // ~ Static fields >> --------------------------------------------------------------------------------------------- >> >> >> >> private static final Logger L = >> LoggerFactory.getLogger(WebServer.class); >> >> >> >> // ~ Instance fields >> ------------------------------------------------------------------------------------------- >> >> >> >> private final int port; >> >> private final Server server; >> >> private final TractDB tractDB; >> >> private final Gson gson; >> >> >> >> // ~ Constructors >> ---------------------------------------------------------------------------------------------- >> >> >> >> public WebServer(final TractDB tractDB, final int port, final Gson >> gson) { >> >> this.tractDB = tractDB; >> >> this.port = port; >> >> this.gson = gson; >> >> this.server = new Server(); >> >> } >> >> >> >> // ~ Methods >> --------------------------------------------------------------------------------------------------- >> >> >> >> @Override >> >> protected void startUp() throws Exception { >> >> >> >> SslContextFactory sslContextFactory = new SslContextFactory(); >> >> >> sslContextFactory.setKeyStore(SSLKeyStore.create("server.keystore")); >> >> >> sslContextFactory.setKeyStorePassword(SSLKeyStore.KEYSTORE_PASSWORD); >> >> sslContextFactory.setProtocol("TLSv1.2"); >> >> >> >> SslConnectionFactory ssl = new >> SslConnectionFactory(sslContextFactory, "http/1.1"); >> >> HttpConnectionFactory http = new HttpConnectionFactory(new >> HttpConfiguration()); >> >> >> >> >> >> /* connectors */ >> >> ServerConnector sslConnector = new >> ServerConnector(this.server, ssl, http); >> >> sslConnector.setPort(this.port); >> >> this.server.addConnector(sslConnector); >> >> >> >> /* handlers */ >> >> >> >> GzipHandler gzip = new GzipHandler(); >> >> RequestHandler requestHandler = new RequestHandler(this.gson, >> this.tractDB); >> >> >> >> gzip.setIncludedMimeTypes("text/html", "text/plain", >> "application/json"); >> >> >> >> gzip.setHandler(requestHandler); >> >> >> >> this.server.setHandler(gzip); >> >> >> >> this.server.start(); >> >> } >> >> >> >> @Override >> >> protected void shutDown() throws Exception { >> >> L.info("shutting down web-server"); >> >> this.server.stop(); >> >> } >> >> } >> >> >> >> >> --------------------------------------------------------------------------------------------- >> >> >> >> >> --------------------------------------------------------------------------------------------- >> >> >> >> public final class RequestHandler extends AbstractHandler { >> >> >> >> // ~ Static fields >> --------------------------------------------------------------------------------------------- >> >> >> >> private static final Logger L = >> LoggerFactory.getLogger(RequestHandler.class); >> >> >> >> // ~ Instance fields >> ------------------------------------------------------------------------------------------- >> >> >> >> // ... >> >> >> >> // ~ Constructors >> ---------------------------------------------------------------------------------------------- >> >> >> >> public RequestHandler(final Gson gson, final TractDB tractDB) { >> >> // ... >> >> } >> >> >> >> // ~ Methods >> --------------------------------------------------------------------------------------------------- >> >> >> >> @Override >> >> public void handle(final String target, final Request baseRequest, >> final HttpServletRequest request, final HttpServletResponse response) >> throws IOException, ServletException { >> >> L.debug("{} '{}'", request.getMethod(), target); >> >> >> >> try { >> >> >> >> /* default result: not found */ >> >> HandlerResult handlerResult = >> JsonResult.notFound(this.gson); >> >> >> >> /* ... Handlers will be dispatched here ... */ >> >> >> >> handlerResult.writeTo(response); >> >> >> >> } catch (RuntimeException e) { >> >> L.error(e.getMessage(), e); >> >> response.reset(); >> >> >> >> JsonResult.internalServerError(this.gson) >> >> .writeTo(response); >> >> } >> >> >> >> baseRequest.setHandled(true); >> >> } >> >> } >> > >> > >> >