|
|
|
Sven Pfeiffer
|
Hi list,
I'd like to use click-mock for testing my click web-application. Several times I need to get the username and role from the request, which AFAIK are set by the SecurityRealm. For example I display the users name on the top of the page using context.getRequest().getUserPrincipal().getName() For security reasons I check the users role in onSecurityCheck() using context.getRequest().isUserInRole(<requiredRole>) Is the a way to inject Username/Role with the mock API? In the moment I am trying the following, which results in a NPEX MockContainer container = new MockContainer("C:/dev/projects/clock-mock-test/src/main/webapp"); container.start(); container.setParameter(Form.FORM_NAME, "filter"); //setting parameters for a FormTable container.setParameter("filterForm_column_0", "entryDate"); container.setParameter("filterForm_operator_0", Operators.AFTER.name()); container.setParameter("filterForm_value_0", "01.07.2009"); //Thats where I get the NPEX MyTestPage page = (MyTestPage) container.testPage(MyTestPage.class); //The page forward to itself assertTrue(MyTestPage.class.getName().equals(container.getForwardPageClass().getName())); container.stop(); In the MockRequest sources I saw that isUserInRole(String role) is not implemented yet and getUserPrincipal returns a Principal with name getHeader("REMOTE_USER"), how can I set REMOTE_USER? Thanks in advance SVen |
|
Bob Schellink-2
|
Hi Sven,
You should be able to set the REMOTE_USER with: container.getRequest().addHeader("REMOTE_USER", "admin"); This won't get you past the unimplemented isUserInRole however. You could provide a custom MockRequest and set that on the Container before starting it e.g: container.setRequest(new MyMockRequest()); container.start(); where MyMockRequest somehow implements isUserInRole. Haven't really though of a way to implement isUserInRole but maybe we can expose a way to setup Roles and Principals for the container which isUserInRole can test against? kind regards bob Sven Pfeiffer wrote: > > I'd like to use click-mock for testing my click web-application. > > Several times I need to get the username and role from the request, > which AFAIK are set by the SecurityRealm. > > For example I display the users name on the top of the page using > context.getRequest().getUserPrincipal().getName() > > For security reasons I check the users role in onSecurityCheck() using > context.getRequest().isUserInRole(<requiredRole>) > > Is the a way to inject Username/Role with the mock API? > In the moment I am trying the following, which results in a NPEX > > MockContainer container = new > MockContainer("C:/dev/projects/clock-mock-test/src/main/webapp"); > container.start(); > container.setParameter(Form.FORM_NAME, "filter"); > > //setting parameters for a FormTable > container.setParameter("filterForm_column_0", "entryDate"); > container.setParameter("filterForm_operator_0", Operators.AFTER.name()); > container.setParameter("filterForm_value_0", "01.07.2009"); > > //Thats where I get the NPEX > MyTestPage page = (MyTestPage) container.testPage(MyTestPage.class); > > //The page forward to itself > assertTrue(MyTestPage.class.getName().equals(container.getForwardPageClass().getName())); > > > container.stop(); > > In the MockRequest sources I saw that > isUserInRole(String role) is not implemented yet and getUserPrincipal > returns a Principal with name getHeader("REMOTE_USER"), how can I set > REMOTE_USER? > > > Thanks in advance > SVen > |
||||||||||||||||
|
Bob Schellink-2
|
Perhaps we can add a "roles" property to the MockRequest then we can do
something like this: // Setup remote user by a new MockPrincipal class Principal p = new MockPrincipal("test"); container.getRequest().setPrincipal(p); // Setup roles container.getRequest().setRoles("admin", "user"); And then isUserInRoles implementation can be simple: public boolean isUserInRoles(String role) { if (roles.contains(role)) { return true; } else { return false; } } Or MockPrincipal can expose a method to set its own roles: public boolean isUserInRoles(String role) { if (getUserPrincipal().getRoles().contains(role)) { return true; } else { return false; } } What do you think? bob Bob Schellink wrote: > Hi Sven, > > You should be able to set the REMOTE_USER with: > > container.getRequest().addHeader("REMOTE_USER", "admin"); > > This won't get you past the unimplemented isUserInRole however. You > could provide a custom MockRequest and set that on the Container before > starting it e.g: > > container.setRequest(new MyMockRequest()); > container.start(); > > where MyMockRequest somehow implements isUserInRole. Haven't really > though of a way to implement isUserInRole but maybe we can expose a way > to setup Roles and Principals for the container which isUserInRole can > test against? > > kind regards > > bob > > Sven Pfeiffer wrote: >> >> I'd like to use click-mock for testing my click web-application. >> >> Several times I need to get the username and role from the request, >> which AFAIK are set by the SecurityRealm. >> >> For example I display the users name on the top of the page using >> context.getRequest().getUserPrincipal().getName() >> >> For security reasons I check the users role in onSecurityCheck() using >> context.getRequest().isUserInRole(<requiredRole>) >> >> Is the a way to inject Username/Role with the mock API? >> In the moment I am trying the following, which results in a NPEX >> >> MockContainer container = new >> MockContainer("C:/dev/projects/clock-mock-test/src/main/webapp"); >> container.start(); >> container.setParameter(Form.FORM_NAME, "filter"); >> >> //setting parameters for a FormTable >> container.setParameter("filterForm_column_0", "entryDate"); >> container.setParameter("filterForm_operator_0", Operators.AFTER.name()); >> container.setParameter("filterForm_value_0", "01.07.2009"); >> >> //Thats where I get the NPEX >> MyTestPage page = (MyTestPage) container.testPage(MyTestPage.class); >> >> //The page forward to itself >> assertTrue(MyTestPage.class.getName().equals(container.getForwardPageClass().getName())); >> >> >> container.stop(); >> >> In the MockRequest sources I saw that >> isUserInRole(String role) is not implemented yet and getUserPrincipal >> returns a Principal with name getHeader("REMOTE_USER"), how can I set >> REMOTE_USER? >> >> >> Thanks in advance >> SVen >> > > |
||||||||||||||||
|
Sven Pfeiffer
|
Hi Bob,
I like the Idea of having a MockPrincipal so on every request I can deside which Principal to use. Which will be very usefull to test the security-related features. So I simply created two classes: AuthenticatedMockRequest public class AuthenticatedMockRequest extends MockRequest { MockPrincipal userPrincipal; public AuthenticatedMockRequest(MockPrincipal userPrincipal) { this.userPrincipal = userPrincipal; } @Override public boolean isUserInRole(String name) { return userPrincipal.getRoles().contains(name); } @Override public Principal getUserPrincipal() { return userPrincipal; } } and MockPrincipal: public class MockPrincipal implements Principal { private String name; private List<String> roles = new ArrayList<String>(); public MockPrincipal(String userName) { this.name = userName; } public MockPrincipal(String userName, List<String> roles) { this.name = userName; this.roles = roles; } @Override public String getName() { return name; } public List<String> getRoles() { return roles; } public void setRoles(String... newRoles) { roles.clear(); for (String role : newRoles) { roles.add(role); } } } And I added the following lines to my testcase: MockPrincipal principal = new MockPrincipal("admin"); principal.setRoles("admin", "user"); container.setRequest(new AuthenticatedMockRequest(principal)); And it works like a charm :) Thanks, once again, for your help! SVen Bob Schellink wrote: > Perhaps we can add a "roles" property to the MockRequest then we can > do something like this: > > // Setup remote user by a new MockPrincipal class > Principal p = new MockPrincipal("test"); > container.getRequest().setPrincipal(p); > > // Setup roles > container.getRequest().setRoles("admin", "user"); > > And then isUserInRoles implementation can be simple: > > public boolean isUserInRoles(String role) { > if (roles.contains(role)) { > return true; > } else { > return false; > } > } > > > Or MockPrincipal can expose a method to set its own roles: > > public boolean isUserInRoles(String role) { > if (getUserPrincipal().getRoles().contains(role)) { > return true; > } else { > return false; > } > } > > What do you think? > > bob > > > Bob Schellink wrote: >> Hi Sven, >> >> You should be able to set the REMOTE_USER with: >> >> container.getRequest().addHeader("REMOTE_USER", "admin"); >> >> This won't get you past the unimplemented isUserInRole however. You >> could provide a custom MockRequest and set that on the Container >> before starting it e.g: >> >> container.setRequest(new MyMockRequest()); >> container.start(); >> >> where MyMockRequest somehow implements isUserInRole. Haven't really >> though of a way to implement isUserInRole but maybe we can expose a >> way to setup Roles and Principals for the container which >> isUserInRole can test against? >> >> kind regards >> >> bob >> >> Sven Pfeiffer wrote: >>> >>> I'd like to use click-mock for testing my click web-application. >>> >>> Several times I need to get the username and role from the request, >>> which AFAIK are set by the SecurityRealm. >>> >>> For example I display the users name on the top of the page using >>> context.getRequest().getUserPrincipal().getName() >>> >>> For security reasons I check the users role in onSecurityCheck() using >>> context.getRequest().isUserInRole(<requiredRole>) >>> >>> Is the a way to inject Username/Role with the mock API? >>> In the moment I am trying the following, which results in a NPEX >>> >>> MockContainer container = new >>> MockContainer("C:/dev/projects/clock-mock-test/src/main/webapp"); >>> container.start(); >>> container.setParameter(Form.FORM_NAME, "filter"); >>> >>> //setting parameters for a FormTable >>> container.setParameter("filterForm_column_0", "entryDate"); >>> container.setParameter("filterForm_operator_0", >>> Operators.AFTER.name()); >>> container.setParameter("filterForm_value_0", "01.07.2009"); >>> >>> //Thats where I get the NPEX >>> MyTestPage page = (MyTestPage) container.testPage(MyTestPage.class); >>> >>> //The page forward to itself >>> assertTrue(MyTestPage.class.getName().equals(container.getForwardPageClass().getName())); >>> >>> >>> container.stop(); >>> >>> In the MockRequest sources I saw that >>> isUserInRole(String role) is not implemented yet and >>> getUserPrincipal returns a Principal with name >>> getHeader("REMOTE_USER"), how can I set REMOTE_USER? >>> >>> >>> Thanks in advance >>> SVen >>> >> >> > > |
||||||||||||||||
|
Bob Schellink-2
|
Great, I've opened a JIRA[1] so we can include this in the next release.
Thanks bob [1]: https://issues.apache.org/jira/browse/CLK-585 Sven Pfeiffer wrote: > Hi Bob, > > I like the Idea of having a MockPrincipal so on every request I can > deside which Principal to use. > Which will be very usefull to test the security-related features. > > So I simply created two classes: > AuthenticatedMockRequest > public class AuthenticatedMockRequest extends MockRequest { > > MockPrincipal userPrincipal; > > public AuthenticatedMockRequest(MockPrincipal userPrincipal) { > this.userPrincipal = userPrincipal; > } > > @Override > public boolean isUserInRole(String name) { > return userPrincipal.getRoles().contains(name); > } > > @Override > public Principal getUserPrincipal() { > return userPrincipal; > } > } > and > > MockPrincipal: > public class MockPrincipal implements Principal { > > private String name; > private List<String> roles = new ArrayList<String>(); > > public MockPrincipal(String userName) { > this.name = userName; > } > > public MockPrincipal(String userName, List<String> roles) { > this.name = userName; > this.roles = roles; > } > > @Override > public String getName() { > return name; > } > > public List<String> getRoles() { > return roles; > } > > public void setRoles(String... newRoles) { > roles.clear(); > for (String role : newRoles) { > roles.add(role); > } > } > } > > And I added the following lines to my testcase: > > MockPrincipal principal = new MockPrincipal("admin"); > principal.setRoles("admin", "user"); > container.setRequest(new AuthenticatedMockRequest(principal)); > > And it works like a charm :) > > Thanks, once again, for your help! > > SVen > > Bob Schellink wrote: >> Perhaps we can add a "roles" property to the MockRequest then we can >> do something like this: >> >> // Setup remote user by a new MockPrincipal class >> Principal p = new MockPrincipal("test"); >> container.getRequest().setPrincipal(p); >> >> // Setup roles >> container.getRequest().setRoles("admin", "user"); >> >> And then isUserInRoles implementation can be simple: >> >> public boolean isUserInRoles(String role) { >> if (roles.contains(role)) { >> return true; >> } else { >> return false; >> } >> } >> >> >> Or MockPrincipal can expose a method to set its own roles: >> >> public boolean isUserInRoles(String role) { >> if (getUserPrincipal().getRoles().contains(role)) { >> return true; >> } else { >> return false; >> } >> } >> >> What do you think? >> >> bob >> >> >> Bob Schellink wrote: >>> Hi Sven, >>> >>> You should be able to set the REMOTE_USER with: >>> >>> container.getRequest().addHeader("REMOTE_USER", "admin"); >>> >>> This won't get you past the unimplemented isUserInRole however. You >>> could provide a custom MockRequest and set that on the Container >>> before starting it e.g: >>> >>> container.setRequest(new MyMockRequest()); >>> container.start(); >>> >>> where MyMockRequest somehow implements isUserInRole. Haven't really >>> though of a way to implement isUserInRole but maybe we can expose a >>> way to setup Roles and Principals for the container which >>> isUserInRole can test against? >>> >>> kind regards >>> >>> bob >>> >>> Sven Pfeiffer wrote: >>>> >>>> I'd like to use click-mock for testing my click web-application. >>>> >>>> Several times I need to get the username and role from the request, >>>> which AFAIK are set by the SecurityRealm. >>>> >>>> For example I display the users name on the top of the page using >>>> context.getRequest().getUserPrincipal().getName() >>>> >>>> For security reasons I check the users role in onSecurityCheck() using >>>> context.getRequest().isUserInRole(<requiredRole>) >>>> >>>> Is the a way to inject Username/Role with the mock API? >>>> In the moment I am trying the following, which results in a NPEX >>>> >>>> MockContainer container = new >>>> MockContainer("C:/dev/projects/clock-mock-test/src/main/webapp"); >>>> container.start(); >>>> container.setParameter(Form.FORM_NAME, "filter"); >>>> >>>> //setting parameters for a FormTable >>>> container.setParameter("filterForm_column_0", "entryDate"); >>>> container.setParameter("filterForm_operator_0", >>>> Operators.AFTER.name()); >>>> container.setParameter("filterForm_value_0", "01.07.2009"); >>>> >>>> //Thats where I get the NPEX >>>> MyTestPage page = (MyTestPage) container.testPage(MyTestPage.class); >>>> >>>> //The page forward to itself >>>> assertTrue(MyTestPage.class.getName().equals(container.getForwardPageClass().getName())); >>>> >>>> >>>> container.stop(); >>>> >>>> In the MockRequest sources I saw that >>>> isUserInRole(String role) is not implemented yet and >>>> getUserPrincipal returns a Principal with name >>>> getHeader("REMOTE_USER"), how can I set REMOTE_USER? >>>> >>>> >>>> Thanks in advance >>>> SVen >>>> >>> >>> >> >> > > |
||||||||||||||||
| Free Embeddable Forum Powered by Nabble | Help |