Class SecurityRealm
- java.lang.Object
-
- hudson.model.AbstractDescribableImpl<SecurityRealm>
-
- hudson.security.SecurityRealm
-
- All Implemented Interfaces:
ExtensionPoint
,Describable<SecurityRealm>
- Direct Known Subclasses:
AbstractPasswordBasedSecurityRealm
,LegacySecurityRealm
public abstract class SecurityRealm extends AbstractDescribableImpl<SecurityRealm> implements ExtensionPoint
Pluggable security realm that connects external user database to Hudson.If additional views/URLs need to be exposed, an active
SecurityRealm
is bound toCONTEXT_ROOT/securityRealm/
throughJenkins.getSecurityRealm()
, so you can define additional pages and operations on yourSecurityRealm
.How do I implement this class?
For compatibility reasons, there are two somewhat different ways to implement a custom SecurityRealm.
One is to override the
createSecurityComponents()
and create key Spring Security components that control the authentication process. The defaultcreateFilter(FilterConfig)
implementation then assembles them into a chain ofFilter
s. All the incoming requests to Hudson go through this filter chain, and when the filter chain is done,SecurityContext.getAuthentication()
would tell us who the current user is.If your
SecurityRealm
needs to touch the defaultFilter
chain configuration (e.g., adding new ones), then you can also overridecreateFilter(FilterConfig)
to do so.This model is expected to fit most
SecurityRealm
implementations.The other way of doing this is to ignore
createSecurityComponents()
completely (by returningSecurityRealm.SecurityComponents
created by the default constructor) and just concentrate oncreateFilter(FilterConfig)
. As long as the resulting filter chain properly sets upAuthentication
object at the end of the processing, Jenkins doesn't really need you to fit the standard Spring Security models likeAuthenticationManager
andUserDetailsService
.This model is for those "weird" implementations.
Views
- loginLink.jelly
-
This view renders the login link on the top right corner of every page, when the user
is anonymous. For
SecurityRealm
s that support user sign-up, this is a good place to show a "sign up" link. SeeHudsonPrivateSecurityRealm
implementation for an example of this. - config.jelly
- This view is used to render the configuration page in the system config screen.
- Since:
- 1.160
- Author:
- Kohsuke Kawaguchi
- See Also:
PluginServletFilter
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
SecurityRealm.SecurityComponents
Just a tuple so that we can create various inter-related security related objects and return them all at once.-
Nested classes/interfaces inherited from interface hudson.ExtensionPoint
ExtensionPoint.LegacyInstancesAreScopedToHudson
-
-
Field Summary
Fields Modifier and Type Field Description static GrantedAuthority
AUTHENTICATED_AUTHORITY
Deprecated.static org.springframework.security.core.GrantedAuthority
AUTHENTICATED_AUTHORITY2
GrantedAuthority
that represents the built-in "authenticated" role, which is granted to anyone non-anonymous.static DescriptorList<SecurityRealm>
LIST
static SecurityRealm
NO_AUTHENTICATION
Singleton constant that represents "no authentication."
-
Constructor Summary
Constructors Constructor Description SecurityRealm()
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static DescriptorExtensionList<SecurityRealm,Descriptor<SecurityRealm>>
all()
Returns all the registeredSecurityRealm
descriptors.boolean
allowsSignup()
Returns true if thisSecurityRealm
allows online sign-up.boolean
canLogOut()
Returns true if thisSecurityRealm
supports explicit logout operation.org.kohsuke.stapler.HttpResponse
commenceSignup(FederatedLoginService.FederatedIdentity identity)
Starts the user registration process for a new user that has the given verified identity.protected List<javax.servlet.Filter>
commonFilters()
CliAuthenticator
createCliAuthenticator(CLICommand command)
Deprecated.No longer used.javax.servlet.Filter
createFilter(javax.servlet.FilterConfig filterConfig)
CreatesFilter
that all the incoming HTTP requests will go through for authentication.abstract SecurityRealm.SecurityComponents
createSecurityComponents()
Creates fully-configuredAuthenticationManager
that performs authentication against the user realm.void
doCaptcha(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp)
Generates a captcha image.void
doLogout(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp)
Handles the logout processing.String
getAuthenticationGatewayUrl()
Returns the URL to submit a form for the authentication.CaptchaSupport
getCaptchaSupport()
List<Descriptor<CaptchaSupport>>
getCaptchaSupportDescriptors()
Descriptor<SecurityRealm>
getDescriptor()
By default looks for a nested class (conventionally namedDescriptorImpl
) implementingDescriptor
and marked withExtension
.static String
getFrom()
Perform a calculation where we should go back after successful loginIdStrategy
getGroupIdStrategy()
Returns theIdStrategy
that should be used for turningGroupDetails.getName()
into an ID.String
getLoginUrl()
Gets the target URL of the "login" link.protected String
getPostLogOutUrl(org.kohsuke.stapler.StaplerRequest req, Authentication auth)
protected String
getPostLogOutUrl2(org.kohsuke.stapler.StaplerRequest req, org.springframework.security.core.Authentication auth)
Controls where the user is sent to after a logout.SecurityRealm.SecurityComponents
getSecurityComponents()
Use this function to get the security components, without necessarily recreating them.IdStrategy
getUserIdStrategy()
Returns theIdStrategy
that should be used for turningUserDetails.getUsername()
into an ID.GroupDetails
loadGroupByGroupname(String groupname)
Deprecated.GroupDetails
loadGroupByGroupname(String groupname, boolean fetchMembers)
Deprecated.GroupDetails
loadGroupByGroupname2(String groupname, boolean fetchMembers)
If thisSecurityRealm
supports a look up ofGroupDetails
by their names, override this method to provide the look up.UserDetails
loadUserByUsername(String username)
Deprecated.org.springframework.security.core.userdetails.UserDetails
loadUserByUsername2(String username)
Shortcut forUserDetailsService.loadUserByUsername(String)
.void
setCaptchaSupport(CaptchaSupport captchaSupport)
protected boolean
validateCaptcha(String text)
Validates the captcha.
-
-
-
Field Detail
-
NO_AUTHENTICATION
public static final SecurityRealm NO_AUTHENTICATION
Singleton constant that represents "no authentication."
-
LIST
@Deprecated public static final DescriptorList<SecurityRealm> LIST
All registeredSecurityRealm
implementations.
-
AUTHENTICATED_AUTHORITY2
public static final org.springframework.security.core.GrantedAuthority AUTHENTICATED_AUTHORITY2
GrantedAuthority
that represents the built-in "authenticated" role, which is granted to anyone non-anonymous.- Since:
- 2.266
-
AUTHENTICATED_AUTHORITY
@Deprecated public static final GrantedAuthority AUTHENTICATED_AUTHORITY
Deprecated.
-
-
Method Detail
-
createSecurityComponents
public abstract SecurityRealm.SecurityComponents createSecurityComponents()
Creates fully-configuredAuthenticationManager
that performs authentication against the user realm. The implementation hides how such authentication manager is configured.AuthenticationManager
instantiation often depends on the user-specified parameters (for example, if the authentication is based on LDAP, the user needs to specify the host name of the LDAP server.) Such configuration is expected to be presented to the user viaconfig.jelly
and then captured as instance variables inside theSecurityRealm
implementation.Your
SecurityRealm
may also wants to alterFilter
set up by overridingcreateFilter(FilterConfig)
.
-
getUserIdStrategy
public IdStrategy getUserIdStrategy()
Returns theIdStrategy
that should be used for turningUserDetails.getUsername()
into an ID. Mostly this should beIdStrategy.CaseInsensitive
but there may be occasions when eitherIdStrategy.CaseSensitive
orIdStrategy.CaseSensitiveEmailAddress
are the correct approach.- Returns:
- the
IdStrategy
that should be used for turningUserDetails.getUsername()
into an ID. - Since:
- 1.566
-
getGroupIdStrategy
public IdStrategy getGroupIdStrategy()
Returns theIdStrategy
that should be used for turningGroupDetails.getName()
into an ID. Note: Mostly this should be the same asgetUserIdStrategy()
but some security realms may have legitimate reasons for a different strategy.- Returns:
- the
IdStrategy
that should be used for turningGroupDetails.getName()
into an ID. - Since:
- 1.566
-
createCliAuthenticator
@Deprecated public CliAuthenticator createCliAuthenticator(CLICommand command)
Deprecated.No longer used.
-
getDescriptor
public Descriptor<SecurityRealm> getDescriptor()
By default looks for a nested class (conventionally namedDescriptorImpl
) implementingDescriptor
and marked withExtension
.Gets the descriptor for this instance.
Descriptor
is a singleton for every concreteDescribable
implementation, so ifa.getClass() == b.getClass()
then by defaulta.getDescriptor() == b.getDescriptor()
as well. (In rare cases a single implementation class may be used for instances with distinct descriptors.)SecurityRealm
is a singleton resource in Hudson, and therefore it's always configured throughconfig.jelly
and never withglobal.jelly
.- Specified by:
getDescriptor
in interfaceDescribable<SecurityRealm>
- Overrides:
getDescriptor
in classAbstractDescribableImpl<SecurityRealm>
-
getAuthenticationGatewayUrl
public String getAuthenticationGatewayUrl()
Returns the URL to submit a form for the authentication. There's no need to override this, except forLegacySecurityRealm
.- See Also:
AuthenticationProcessingFilter2
-
getLoginUrl
public String getLoginUrl()
Gets the target URL of the "login" link. There's no need to override this, except forLegacySecurityRealm
. On legacy implementation this should point tologinEntry
, which is protected byweb.xml
, so that the user can be eventually authenticated by the container.Path is relative from the context root of the Hudson application. The URL returned by this method will get the "from" query parameter indicating the page that the user was at.
-
canLogOut
public boolean canLogOut()
Returns true if thisSecurityRealm
supports explicit logout operation.If the method returns false, "logout" link will not be displayed. This is useful when authentication doesn't require an explicit login activity (such as NTLM authentication or Kerberos authentication, where Hudson has no ability to log off the current user.)
By default, this method returns true.
- Since:
- 1.307
-
getPostLogOutUrl2
protected String getPostLogOutUrl2(org.kohsuke.stapler.StaplerRequest req, org.springframework.security.core.Authentication auth)
Controls where the user is sent to after a logout. By default, it's the top page of Hudson, but you can return arbitrary URL.- Parameters:
req
-StaplerRequest
that represents the current request. Primarily so that you can get the context path. By the time this method is called, the session is already invalidated. Never null.auth
- TheAuthentication
object that represents the user that was logging in. This parameter allows you to redirect people to different pages depending on who they are.- Returns:
- never null.
- Since:
- 2.266
- See Also:
doLogout(StaplerRequest, StaplerResponse)
-
getPostLogOutUrl
@Deprecated protected String getPostLogOutUrl(org.kohsuke.stapler.StaplerRequest req, Authentication auth)
Deprecated.- Since:
- 1.314
-
getCaptchaSupport
public CaptchaSupport getCaptchaSupport()
-
setCaptchaSupport
public void setCaptchaSupport(CaptchaSupport captchaSupport)
-
getCaptchaSupportDescriptors
public List<Descriptor<CaptchaSupport>> getCaptchaSupportDescriptors()
-
doLogout
public void doLogout(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp) throws IOException, javax.servlet.ServletException
Handles the logout processing.The default implementation erases the session and do a few other clean up, then redirect the user to the URL specified by
getPostLogOutUrl2(StaplerRequest, Authentication)
.- Throws:
IOException
javax.servlet.ServletException
- Since:
- 1.314
-
allowsSignup
public boolean allowsSignup()
Returns true if thisSecurityRealm
allows online sign-up. This creates a hyperlink that redirects users toCONTEXT_ROOT/signUp
, which will be served by thesignup.jelly
view of this class.If the implementation needs to redirect the user to a different URL for signing up, use the following jelly script as
signup.jelly
<xmp> <st:redirect url="http://www.sun.com/" xmlns:st="jelly:stapler"/> </xmp>
-
loadUserByUsername2
public org.springframework.security.core.userdetails.UserDetails loadUserByUsername2(String username) throws org.springframework.security.core.userdetails.UsernameNotFoundException
Shortcut forUserDetailsService.loadUserByUsername(String)
.- Returns:
- never null.
- Throws:
UserMayOrMayNotExistException2
- If the security realm cannot even tell if the user exists or not.org.springframework.security.core.userdetails.UsernameNotFoundException
- Since:
- 2.266
-
loadUserByUsername
@Deprecated public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException
Deprecated.
-
loadGroupByGroupname2
public GroupDetails loadGroupByGroupname2(String groupname, boolean fetchMembers) throws org.springframework.security.core.userdetails.UsernameNotFoundException
If thisSecurityRealm
supports a look up ofGroupDetails
by their names, override this method to provide the look up.This information, when available, can be used by
AuthorizationStrategy
s to improve the UI and error diagnostics for the user.- Parameters:
groupname
- the name of the group to fetchfetchMembers
- iftrue
then try and fetch the members of the group if it exists. Trying does not imply that the members will be fetched andGroupDetails.getMembers()
may still returnnull
- Throws:
UserMayOrMayNotExistException2
- if no conclusive result could be determined regarding the group existence.org.springframework.security.core.userdetails.UsernameNotFoundException
- if the group does not exist.- Since:
- 2.266
-
loadGroupByGroupname
@Deprecated public GroupDetails loadGroupByGroupname(String groupname) throws UsernameNotFoundException, DataAccessException
Deprecated.
-
loadGroupByGroupname
@Deprecated public GroupDetails loadGroupByGroupname(String groupname, boolean fetchMembers) throws UsernameNotFoundException, DataAccessException
Deprecated.- Throws:
UsernameNotFoundException
DataAccessException
- Since:
- 1.549
-
commenceSignup
public org.kohsuke.stapler.HttpResponse commenceSignup(FederatedLoginService.FederatedIdentity identity)
Starts the user registration process for a new user that has the given verified identity.If the user logs in through a
FederatedLoginService
, verified that the current user owns an identity, but no existing user account has claimed that identity, then this method is invoked.The expected behaviour is to confirm that the user would like to create a new account, and associate this federated identity to the newly created account (via
FederatedLoginService.FederatedIdentity.addToCurrentUser()
.- Throws:
UnsupportedOperationException
- If this implementation doesn't support the signup through this mechanism. This is the default implementation.- Since:
- 1.394
-
doCaptcha
public final void doCaptcha(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp) throws IOException
Generates a captcha image.- Throws:
IOException
-
validateCaptcha
protected final boolean validateCaptcha(String text)
Validates the captcha.
-
getSecurityComponents
public SecurityRealm.SecurityComponents getSecurityComponents()
Use this function to get the security components, without necessarily recreating them.
-
createFilter
public javax.servlet.Filter createFilter(javax.servlet.FilterConfig filterConfig)
CreatesFilter
that all the incoming HTTP requests will go through for authentication.The default implementation uses
getSecurityComponents()
and builds a standard filter chain. But subclasses can override this to completely change the filter sequence.For other plugins that want to contribute
Filter
, seePluginServletFilter
.- Since:
- 1.271
-
commonFilters
protected final List<javax.servlet.Filter> commonFilters()
-
getFrom
@Restricted(org.kohsuke.accmod.restrictions.DoNotUse.class) public static String getFrom()
Perform a calculation where we should go back after successful login- Returns:
- Encoded URI where we should go back after successful login or "/" if no way back or an issue occurred
- Since:
- 2.4
-
all
public static DescriptorExtensionList<SecurityRealm,Descriptor<SecurityRealm>> all()
Returns all the registeredSecurityRealm
descriptors.
-
-