В качестве обходного пути, вы можете добавить новый маппинг для REST сервлета в web.xml
:
<servlet-mapping>
<servlet-name>rest_api</servlet-name>
<url-pattern>/rest/*</url-pattern>
<!-- add new URL pattern -->
<url-pattern>/oauth/*</url-pattern>
</servlet-mapping>
В этом случае, сервлет REST (и все его методы) будет доступен по 2 путям: /rest/
и /oauth/
.
Затем, следуя инструкции создать контроллер с маппингом на /login
.
В этом примере вход всегда выполняется от admin
, реальную логику обработки запроса вам нужно разработать самим:
@Controller
public class DemoAuthController {
@Inject
private OAuthTokenIssuer oAuthTokenIssuer;
@Inject
private Configuration configuration;
@Inject
private TrustedClientService trustedClientService;
@Inject
private MessageTools messageTools;
@RequestMapping(method = RequestMethod.POST, path = "login")
public ResponseEntity post() {
// obtain system session to be able to call middleware services
WebAuthConfig webAuthConfig = configuration.getConfig(WebAuthConfig.class);
UserSession systemSession;
try {
systemSession = trustedClientService.getSystemSession(webAuthConfig.getTrustedClientPassword());
} catch (LoginException e) {
throw new RuntimeException("Error during system auth");
}
// set security context
AppContext.setSecurityContext(new SecurityContext(systemSession));
try {
// generate token for "promo-user"
OAuthTokenIssuer.OAuth2AccessTokenResult tokenResult =
oAuthTokenIssuer.issueToken("admin", messageTools.getDefaultLocale(), Collections.emptyMap());
OAuth2AccessToken accessToken = tokenResult.getAccessToken();
// set security HTTP headers to prevent browser caching of security token
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.CACHE_CONTROL, "no-store");
headers.set(HttpHeaders.PRAGMA, "no-cache");
return new ResponseEntity<>(accessToken, headers, HttpStatus.OK);
} finally {
// clean up security context
AppContext.setSecurityContext(null);
}
}
}
Полный код проекта можно найти на Github.